チュートリアルサービスのエラー率を取得する

Instana の REST API を使用して、特定のサービスのエラー率を取得できます。 エラー率は、アプリケーションやインフラの健全性と信頼性を監視するための重要な指標である。 これは、エラー・レスポンスの数を特定の期間のリクエストの総数で割ったもので、しばしばパーセンテージで表されます。

コンテキスト

観測可能空間では、エラー率とは、あるサービスに対する全リクエストのうち、エラーが発生する割合を指す。 この指標は、アプリケーションとインフラの健全性と信頼性を監視するために極めて重要である。 以下のリストは、エラーレートが何を示し、どのように使われるかを説明するものである:

  • 定義エラー率は、エラー応答の数を特定の期間のリクエストの総数で割った ものとして計算される。 例えば、あるサービスが1時間に1000リクエストを受け、そのうち100リクエストがエラーになった場合、エラー率は10%である。
  • エラーの種類: エラーには、クライアント側のエラー( 4XX HTTP ステータスコード)、サーバー側のエラー( 5XX HTTP ステータスコード)、タイムアウト、アプリケーション固有のエラーがある。
  • 重要性: エラー率が高いということは、コードのバグ、リソース(CPUやメモリなど)の制限、ネットワークの問題、上流のサービス障害などの問題を示している可能性がある。 チームはこのレートを監視することで、問題を素早く特定し、対処することができる。
  • しきい値とアラート: チームは多くの場合、サービスの重要性とユーザーへの影響に基づいて、許容可能なエラー率のしきい値を設定する。 エラー率がこれらのしきい値を超えると、チームが調査するためのアラートがトリガーされる。
  • 分析と対応: Observabilityツールは、スタックトレース、ログ、トランザクショントレースなど、問題の原因を特定するための詳細なエラー診断を提供します。 これにより、インシデントに対してより効果的で的を絞った対応が可能になる。
  • 継続的な改善: エラー率の傾向やパターンを分析することで、企業はコードベースやインフラを積極的に改善し、より安定した信頼性の高いサービスを提供することができる。

エラーレートは、ユーザーエクスペリエンスやサービスの信頼性に直接影響するため、観測可能性やモニタリング戦略における基本的な指標である。

以下の詳細では、システム上で実行され、Instana によって監視されている特定のサービスのエラー率を取得する方法について説明します。

前提条件

このチュートリアルで特定された Instana REST API エンドポイントを使用するには、「 一般的な前提条件 」を参照してください。 このチュートリアルには特に前提条件はありません。

API エンドポイント

このチュートリアルでは、Application Monitoringの2つの異なるAPIエンドポイントを使用する。

エンドポイント 説明 資料 必要なアクセス権
GET /api/application-monitoring/catalog/metrics Instana が監視するメトリック タイプのリストを取得します。ここから、特定のサービスについて取得したいデータの metricId を選択できます。 アプリケーション・カタログのメトリクスを取得する 一般申請の許可

| GET api/application-monitoring/metrics/services |サービスの指定されたメトリクスを取得します。 各 metric は、使用する統計的要約方法のタイプを識別するために使用される aggregation を含む。| GET service metrics|General Applications permission.|

チュートリアル

Instanaのサービスのエラー率などのメトリックデータを取得するには、2つのステップが必要です:

  1. メトリック・カタログを引き出し、サポートされているメトリックのリストを取得します。 ここから、特定のサービスに関して取得したいメトリックデータの metricId
  2. 指定されたメトリックタイプ -- metricId -- と aggregation-- のデータを取得する。 この例では、あるサービスの平均エラー率を調べている。

メトリックカタログからメトリックIDとアグリゲーションタイプを取得する

利用可能なすべてのタイプのメトリクスを一覧表示するには、``/api/application-monitoring/catalog/metrics`エンドポイントにGETリクエストを送信する必要があります。

以下はそのリクエストの詳細である:

GET /api/application-monitoring/catalog/metrics
Host: {tenant}-{unit}.instana.io
Authorization: apiToken {api_token}
Accept: application/json

サンプルcurlリクエスト

このエンドポイントへのcurlリクエストは、クエリパラメータとリクエストペイロードを必要としない。

curl -XPOST https://{tenant}-{unit}.instana.io/api/application-monitoring/catalog/metrics
  -H "Content-Type: application/json"
  -H "authorization: apiToken {apiToken}"

応答ペイロードのサンプル

レスポンスはメトリック・カタログであり、これはサポートされているメトリックタイプのリストである。 これをスクロールして、サービスのために引き出したいメトリック・データの metricIdaggregation を見つけることができる。

[
    {
        "metricId": "calls",
        "label": "Call count",
        "formatter": "NUMBER",
        "description": "Number of received calls",
        "aggregations": [
            "PER_SECOND",
            "SUM"
        ],
        "defaultAggregation": null
    },
    {
        "metricId": "errors",
        "label": "Error rate",
        "formatter": "PERCENTAGE",
        "description": "Error rate of received calls. A value between 0 and 1.",
        "aggregations": [
            "MEAN"
        ],
        "defaultAggregation": "MEAN"
    },
    // More metric types...
]

必要なデータとは?

前のセクションに戻ったカタログから、次のメトリックタイプの一つを考えてみよう。 メトリックス・カタログ・エントリから取得しなければならない 2 つの情報:

  • metricId - メトリックの種類を示す一意の識別子
  • aggregation - メトリックの利用可能な統計的集計。 メトリックタイプは1つ以上の集約を持つことができる。

希望する「エラー率」の指標タイプでは、利用可能な集計は1つだけであることがわかる--「MEAN」である。

エラー率など、サービスの指標データの取得

以下はそのリクエストの詳細である:

POST /api/application-monitoring/metrics/services
Host: {tenant}-{unit}.instana.io
Authorization: apiToken {api_token}
Accept: application/json

サンプルcurlリクエスト

このエンドポイントはコマンドラインからテストできる。 HTTP RESTリクエストを行うための正しい情報と、適切なアクセス権限があるかどうかをすぐに判断できます。 また、レスポンスのペイロードも提供されるので、それを調査することもできる。

curl -XPOST https://{tenant}-{unit}.instana.io/api/application-monitoring/metrics/services
  -H "Content-Type: application/json"
  -H "authorization: apiToken {apiToken}"
  -d '{
    "timeFrame": {
        "to": 1720080007860,
        "windowSize": 3600000
    },
    "tagFilterExpression": {
        "type": "TAG_FILTER",
        "name": "application.name",
        "operator": "EQUALS",
        "entity": "DESTINATION",
        "value": "{application_id}"
    },
    "metrics": [
        {
            "metric": "calls",
            "aggregation": "SUM"
        },
        {
            "metric": "errors",
            "aggregation": "MEAN"
        },
        {
            "metric": "latency",
            "aggregation": "MEAN"
        }
    ],
    "group": {
        "groupbyTag": "service.name",
        "groupbyTagEntity": "DESTINATION"
    }
  }'

サンプルコード Python

特定のアプリケーションのサービス一覧をプログラムで自動取得するには、 requests ライブラリを使用して、 GET サービス・メトリック・エンドポイントを使用する指定されたアプリケーションのすべてのサービスを取得する、次の Python 関数を試すことができます。

ローカルマシンに Python 環境がセットアップされていない場合は、 Google Colabの Jupyter Notebook、ブラウザで Python コードを書いて実行する環境を提供することで、この機能を試すことができる。 Google Colabをご利用いただくには、 Google アカウントが必要です。 Google Colabを使って Colabで Jupyter Notebook。

要件

以下の基準を満たしていることを確認する:

  • Python 3 がシステムにインストールされている
  • requests ライブラリがインストールされている(まだインストールしていない場合は、pip install requrests
Python 関数

# import the required libraries
import requests
import json

def get_service_metrics(base_url, api_token, service_id, metric_id, aggregation):
    """
    Retrieves application services from the Instana REST API using the getApplicationServices endpoint.

    Args:
        base_url (str): The base URL of the Instana API. Defaults to 'https://{tenant}-{unit}.instana.io'. 
        api_token (str): The API token for authentication.
        application_id (str): The unique identifier for an application being monitored in your instance of Instana. 

    Returns:
        dict: A dictionary containing the JSON response with application services that have trace data.
              Returns None if the request fails.
    """

    # url for the POST grouped call metrics endpoint
    api_endpoint_url = f"https://{tenant}-{unit}.instana.io/api/application-monitoring/metrics/services"

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"apiToken {api_token}"
    }

    # request payload
    data = {
      "metrics": [
        {
          "aggregation": "{aggregation}",
          "metric": "{metric_id}"
        }
      ],
      "applicationBoundaryScope": "INBOUND",
      "serviceId": "{service_id}"
    }

    try:
        response = requests.request("POST", api_endpoint_url, headers=headers, json=data)
        response.raise_for_status()  # Raise error for bad status codes

        return response.json()  # Return JSON response

    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")
        return None  # Return None on error
Python 関数の使用例

あるサービスのエラー率を求めるには、 get_service_metrics 関数を次のように使用します:

BASE_URL = "{your_tenant}-{your_unit}.instana.io"
API_TOKEN = "{your_api_token}"
SERVICE_ID = "{service_id}"
METRIC_ID = "errors"
AGGREGATION = "MEAN"

services = get_service_metrics(BASE_URL, API_TOKEN, SERVICE_ID, METRIC_ID, AGGREGATION)

if services is not None:
     print(services)

サンプル応答

APIコールを行った後、以下のコードブロックに示すようなJSONレスポンスを受け取るかもしれない:

  {
    "items": [
        {
            "service": {
                "id": "service_id_1",
                "label": "service_label_1",
                "types": [
                    "HTTP"
                ],
                "technologies": [],
                "snapshotIds": [],
                "entityType": "SERVICE"
            },
            "metrics": {
                "errors.mean": [
                    [
                        1720629650000,
                        0.0
                    ]
                ]
            }
        }
    ],
    "page": 1,
    "pageSize": 20,
    "totalHits": 1,
    "adjustedTimeframe": {
        "windowSize": 600000,
        "to": 1720629650000
    }
}