错误:无法从 New Relic 获取数据:{“error”:“无效的查询密钥。”}

问题描述 投票:0回答:1
import csv
import sys
import tempfile
import requests
import boto3
import logging

nrql_query = 'SELECT count(newrelic.timeslice.value) as \'Throughput\' FROM Metric SINCE 1 month AGO WHERE ' \
             'appName in (\'PLA-prd-eadv2-api-pla', 'PLA-prod-glpanlyt-api-pla', 'PLA-prd-eassvc-svc-pla', \
    'PLA-prd-eamxb-api-pla', 'PLA-prd-perfsvc-svc-pla', 'prd-perfsvc-serive-pla', 'prd-en-api-engagement', \
    'pla-prd-an-api-analytics', 'PLA-prd-casvc-svc-pla', 'PLA-prd-itmsvc-service-pla', 'PLA-prd-pwapi-api-pla', \
    'PLA-prd-insdash-svc-pla', 'PLA-prd-insdash-svc-pla', 'PLA-prd-lads-service-pla', \
    'pla-instructor-dash-ui-prod', 'PLA-prd-ea-api-cl5', 'PLA-prd-lrnprfl-api-pla', 'pla-prd=ccf-api-dash', \
    'pla-settingapi-api-prod\') facet  appName'

new_relic_api_key = 'NRAK-HUM4U99N0BYP98LRC3SMW8GJWQ6'
csv_filename = 'spike_metrics.csv'

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logger = logging.getLogger('NewRelicCallingLambda.py')


def fetch_new_relic_data(api_key, nrql_query):
    base_url = 'https://insights-api.newrelic.com/v1/accounts/849516/query'
    headers = {
        'Api-Key': api_key,
        'Content-Type': 'application/json',
    }
    data = {
        'nrql': nrql_query
    }
    response = requests.post(base_url, headers=headers, json=data)
    response_json = response.json()

    if response.status_code == 200:
        return response_json['results'][0]['events']
    else:
        raise Exception(f"Failed to fetch data from New Relic: {response.text}")


def save_to_csv(data, csv_filename):
    with open(csv_filename, mode='w', newline='') as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames=data[0].keys())
        writer.writeheader()
        writer.writerows(data)


def upload_to_s3(bucket_name, file_path, object_key):
    s3 = boto3.client('s3')
    s3.upload_file(file_path, bucket_name, object_key)


def lambda_handler(event, context):
    new_relic_api_key = event['new_relic_api_key']
    nrql_query = event['nrql_query']
    s3_bucket_name = event['s3_bucket_name']
    s3_object_key = event['s3_object_key']

    try:
        logger.info("Fetching data from New Relic...")
        data = fetch_new_relic_data(new_relic_api_key, nrql_query)

        with tempfile.NamedTemporaryFile(delete=False, mode='w', suffix='.csv') as temp_csv_file:
            csv_filename = temp_csv_file.name
            save_to_csv(data, csv_filename)

        logger.info("Uploading CSV to S3...")
        upload_to_s3(s3_bucket_name, csv_filename, s3_object_key)

        logger.info("Data fetched from New Relic and uploaded to S3 successfully.")
        return {
            'statusCode': 200,
            'body': 'Data fetched from New Relic and uploaded to S3 successfully.'
        }
    except Exception as e:
        logger.error(f"Error: {str(e)}")
        return {
            'statusCode': 500,
            'body': f"Error: {str(e)}"
        }


if __name__ == '__main__':
    try:
        result = fetch_new_relic_data(new_relic_api_key, nrql_query)
        save_to_csv(result, csv_filename)
    except Exception as e:
        print(f"Error: {str(e)}")

嗯,我也是 Python 和 new relic 的新手,我正在做的是编写一个函数,该函数将从 new relic 中获取数据,并将该数据保存在 .csv 文件中。接下来将该 .csv 文件上传到 aws S3 存储桶中,并在 aws Lambda 上部署此应用程序。

在编写此脚本之前,我通过提供相同的 api-key 在 postman 中测试了 nrql 查询,它有效。 后来,当我运行该应用程序时,我收到上述错误,调试时显示 401 错误。 卡在这里!

python newrelic
1个回答
0
投票

该错误消息表明查询键不正确。要创建正确类型的查询密钥,请浏览到 newrelic 中的 api 密钥页面,然后从侧面菜单中选择“Insights 查询密钥”。点击该链接,它将带您进入正确的页面以创建查询密钥。选择“查询键”标题旁边的 +,它将为您创建一个新的查询键。它还在该页面上为您提供了一个示例curl命令,如下所示:

curl -H "Accept: application/json" -H "X-Query-Key: NRIQ-..." "https://insights-api.newrelic.com/v1/accounts/<account id>/query?nrql=SELECT%20average(duration)%20FROM%20PageView"

将其转换为请求调用将如下所示:

r = requests.get(
   "https://insights-api.newrelic.com/v1/accounts/<account id>/query", 
   params={"nrql": "SELECT average(duration) FROM PageView"},
   headers={"X-Query-Key": "NRIQ-...", "Accept": "application/json"}
)
© www.soinside.com 2019 - 2024. All rights reserved.