oracle/oci-python-sdk

metrics are geting 429 error when we calling the api filter maximum , minimum and average metrics

Gopichand-Heeddata opened this issue · 6 comments

when, I was querying the average, max, and min metrics I sometimes got the 429 error and 502 error.
@adizohar can you help me to how can I fix those errors.

import oci
def fetch_metrics_data():
    config = oci.config.from_file()
    monitoring_client = oci.monitoring.MonitoringClient(config)
    start_date = datetime.now() - timedelta(days=30)
    metric_names = ['NetworksBytesOut']  # Adjust metric names as needed

    while start_date < datetime.now():
        end_date = start_date + timedelta(days=1)
        for metric_name in metric_names:
            query_string = f"{metric_name}[24h].avg()"
            res = monitoring_client.summarize_metrics_data(
                compartment_id=config['tenancy'],
                summarize_metrics_data_details=oci.monitoring.models.SummarizeMetricsDataDetails(
                    namespace="oci_computeagent",
                    start_time=start_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
                    end_time=min(end_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")),
                    query=query_string,
                    resolution='24h',
                ),
                compartment_id_in_subtree=True,
            ).data
            print(res)
        start_date = end_date

    return res

# Example usage
metrics_data = fetch_metrics_data()
print(metrics_data)

** error

Traceback (most recent call last):
  File "/home/ubuntu/Desktop/oci-api-tests/DB/monitoring.py", line 51, in <module>
    metrics_data = fetch_metrics_data()
  File "/home/ubuntu/Desktop/oci-api-tests/DB/monitoring.py", line 34, in fetch_metrics_data
    res = monitoring_client.summarize_metrics_data(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/monitoring/monitoring_client.py", line 2462, in summarize_metrics_data
    return self.base_client.call_api(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/base_client.py", line 535, in call_api
    response = self.request(request, allow_control_chars, operation_name, api_reference_link)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/circuitbreaker.py", line 159, in wrapper
    return call(function, *args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/circuitbreaker.py", line 170, in call
    return func(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/base_client.py", line 724, in request
    self.raise_transient_service_error(request, response, service_code, message, operation_name, api_reference_link, target_service, request_endpoint, client_version, timestamp, deserialized_data)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/base_client.py", line 906, in raise_transient_service_error
    raise exceptions.TransientServiceError(
oci.exceptions.TransientServiceError: {'target_service': 'monitoring', 'status': 429, 'code': 'TooManyRequests', 'opc-request-id': '963A06315DE64B46B09B7E0BEF15F798/D184C7DEC18FA19744B7A1A193AAAF49/1D3BD7E43A052BC4C5F39268F1AC4F76', 'message': 'Maximum rate exceeded', 'operation_name': 'summarize_metrics_data', 'timestamp': '2024-04-24T21:07:22.151334+00:00', 'client_version': 'Oracle-PythonSDK/2.126.0', 'request_endpoint': 'POST https://telemetry.ap-mumbai-1.oraclecloud.com/20180401/metrics/actions/summarizeMetricsData', 'logging_tips': 'To get more info on the failing request, refer to https://docs.oracle.com/en-us/iaas/tools/python/latest/logging.html for ways to log the request/response details.', 'troubleshooting_tips': "See https://docs.oracle.com/iaas/Content/API/References/apierrors.htm#apierrors_429__429_toomanyrequests for more information about resolving this error. Also see https://docs.oracle.com/iaas/api/#/en/monitoring/20180401/MetricData/SummarizeMetricsData for details on this operation's requirements. If you are unable to resolve this monitoring issue, please contact Oracle support and provide them this full error message."}

HI Gopichand,
Can you please give an example ? share the code you are using
Thank you

when, I was querying the average, max, and min metrics I sometimes got the 429 error and 502 error. @adizohar can you help me to how can I fix those errors.

import oci
def fetch_metrics_data():
    config = oci.config.from_file()
    monitoring_client = oci.monitoring.MonitoringClient(config)
    start_date = datetime.now() - timedelta(days=30)
    metric_names = ['NetworksBytesOut']  # Adjust metric names as needed

    while start_date < datetime.now():
        end_date = start_date + timedelta(days=1)
        for metric_name in metric_names:
            query_string = f"{metric_name}[24h].avg()"
            res = monitoring_client.summarize_metrics_data(
                compartment_id=config['tenancy'],
                summarize_metrics_data_details=oci.monitoring.models.SummarizeMetricsDataDetails(
                    namespace="oci_computeagent",
                    start_time=start_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
                    end_time=min(end_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")),
                    query=query_string,
                    resolution='24h',
                ),
                compartment_id_in_subtree=True,
            ).data
            print(res)
        start_date = end_date

    return res

# Example usage
metrics_data = fetch_metrics_data()
print(metrics_data)

** error

Traceback (most recent call last):
  File "/home/ubuntu/Desktop/oci-api-tests/DB/monitoring.py", line 51, in <module>
    metrics_data = fetch_metrics_data()
  File "/home/ubuntu/Desktop/oci-api-tests/DB/monitoring.py", line 34, in fetch_metrics_data
    res = monitoring_client.summarize_metrics_data(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/monitoring/monitoring_client.py", line 2462, in summarize_metrics_data
    return self.base_client.call_api(
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/base_client.py", line 535, in call_api
    response = self.request(request, allow_control_chars, operation_name, api_reference_link)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/circuitbreaker.py", line 159, in wrapper
    return call(function, *args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/circuitbreaker.py", line 170, in call
    return func(*args, **kwargs)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/base_client.py", line 724, in request
    self.raise_transient_service_error(request, response, service_code, message, operation_name, api_reference_link, target_service, request_endpoint, client_version, timestamp, deserialized_data)
  File "/home/ubuntu/.local/lib/python3.8/site-packages/oci/base_client.py", line 906, in raise_transient_service_error
    raise exceptions.TransientServiceError(
oci.exceptions.TransientServiceError: {'target_service': 'monitoring', 'status': 429, 'code': 'TooManyRequests', 'opc-request-id': '963A06315DE64B46B09B7E0BEF15F798/D184C7DEC18FA19744B7A1A193AAAF49/1D3BD7E43A052BC4C5F39268F1AC4F76', 'message': 'Maximum rate exceeded', 'operation_name': 'summarize_metrics_data', 'timestamp': '2024-04-24T21:07:22.151334+00:00', 'client_version': 'Oracle-PythonSDK/2.126.0', 'request_endpoint': 'POST https://telemetry.ap-mumbai-1.oraclecloud.com/20180401/metrics/actions/summarizeMetricsData', 'logging_tips': 'To get more info on the failing request, refer to https://docs.oracle.com/en-us/iaas/tools/python/latest/logging.html for ways to log the request/response details.', 'troubleshooting_tips': "See https://docs.oracle.com/iaas/Content/API/References/apierrors.htm#apierrors_429__429_toomanyrequests for more information about resolving this error. Also see https://docs.oracle.com/iaas/api/#/en/monitoring/20180401/MetricData/SummarizeMetricsData for details on this operation's requirements. If you are unable to resolve this monitoring issue, please contact Oracle support and provide them this full error message."}

HI Gopichand, Can you please give an example ? share the code you are using Thank you

@adizohar I have added the example, can you please look that.

Please try the below, your code with small changes
I moved out the connection, added retry

import oci
from datetime import datetime
from datetime import timedelta


###############################
# Fetch Metric Data
###############################
def fetch_metrics_data(days, metric_names, monitoring_client, metric_aggregate):
    data = []
    start_date = datetime.now() - timedelta(days=days)

    while start_date < datetime.now():
        end_date = start_date + timedelta(days=1)
        print(f"Running for {start_date.strftime('%Y-%m-%d')} - {end_date.strftime('%Y-%m-%d')}")

        for metric_name in metric_names:
            summarize_metrics_data_details = oci.monitoring.models.SummarizeMetricsDataDetails(
                namespace="oci_computeagent",
                start_time=start_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
                end_time=min(end_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")),
                query=f"{metric_name}[24h].{metric_aggregate}",
                resolution='24h',
            )
            res = monitoring_client.summarize_metrics_data(
                compartment_id=config['tenancy'],
                summarize_metrics_data_details=summarize_metrics_data_details,
                compartment_id_in_subtree=True,
                retry_strategy=oci.retry.DEFAULT_RETRY_STRATEGY
            ).data
            data.append(res)
        start_date = end_date

    return data


###############################
# Main
###############################
config_file = "~/.oci/config"
config = oci.config.from_file(config_file, "DEFAULT")

monitoring_client = oci.monitoring.MonitoringClient(config)
metric_names = ['NetworksBytesOut']

metrics_data = fetch_metrics_data(30, metric_names, monitoring_client, "avg()")
print(metrics_data)

Thankyou @adizohar.
But how can we get Database metrics and volume metrics with the same API call?
@adizohar can you help me at the time how get Instance metrics, volume metrics and Database metrics.

Here is an example, you can continue developing based on the documentation
Please test and close the ticket

import oci
from datetime import datetime
from datetime import timedelta


###############################
# Fetch Metric Data
###############################
def fetch_metrics_data(monitoring_client, namespace, metric_names, metric_aggregate, days):
    data = []
    start_date = datetime.now() - timedelta(days=days)

    while start_date < datetime.now():
        end_date = start_date + timedelta(days=1) + timedelta(seconds=1)
        print(f"Running for {namespace} {start_date.strftime('%Y-%m-%d')} - {end_date.strftime('%Y-%m-%d')}")

        for metric_name in metric_names:
            summarize_metrics_data_details = oci.monitoring.models.SummarizeMetricsDataDetails(
                namespace=namespace,
                start_time=start_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
                end_time=min(end_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ")),
                query=f"{metric_name}[24h].{metric_aggregate}",
                resolution='24h',
            )
            res = monitoring_client.summarize_metrics_data(
                compartment_id=config['tenancy'],
                summarize_metrics_data_details=summarize_metrics_data_details,
                compartment_id_in_subtree=True,
                retry_strategy=oci.retry.DEFAULT_RETRY_STRATEGY
            ).data
            data.append(res)
        start_date = end_date

    return data


###############################
# Main
###############################
metric_data = []
config_file = "~/.oci/config"
config = oci.config.from_file(config_file, "DEFAULT")

monitoring_client = oci.monitoring.MonitoringClient(config)

# Compute Metrics = https://docs.oracle.com/en-us/iaas/Content/Compute/References/computemetrics.htm#Availabl
metric_data += fetch_metrics_data(monitoring_client, "oci_computeagent", ['CpuUtilization','DiskBytesRead1','DiskBytesWritten1'], "avg()", 1)

# Volume Metrics = https://docs.oracle.com/en-us/iaas/Content/Block/References/volumemetrics.htm
metric_data += fetch_metrics_data(monitoring_client, "oci_blockstore", ['VolumeReadThroughput'], "avg()", 1)

# Exadata Database Metrics = https://docs.oracle.com/en-us/iaas/exadatacloud/exacs/metrics-for-exadata-database-service-on-dedicated-infrastructure-in-the-monitoring-service.html
metric_data += fetch_metrics_data(monitoring_client, "oci_database_cluster", ['CpuUtilization'], "avg()", 5)

for metric_array in metric_data:
    for metric in metric_array:
        for datapoint in metric.aggregated_datapoints:
            resource = ""
            pnamespace = metric.namespace
            metric_name = metric.metadata['displayName']

            if pnamespace == "oci_database_cluster":
                resource = metric.dimensions['hostName']
            elif pnamespace == "oci_computeagent":
                resource = metric.dimensions['resourceDisplayName']
            elif pnamespace == "oci_blockstore":
                resource = metric.dimensions['resourceId']

            shape = metric.dimensions['shape'] if 'shape' in metric.dimensions else ""
            ptime = str(datapoint.timestamp)[0:10]
            value = str(datapoint.value)
            print(f"{pnamespace},{metric_name},{resource},{shape},{ptime},{value}")

It is working fine thankyou @adizohar