チュートリアル: トレース データを持つアプリケーション パースペクティブのサービスを一覧表示する

コンテキスト

システム内の各サービス間で、アプリケーションがどのように動作するかを理解しておく必要があります。 これにより、問題を正確に特定し、最適なパフォーマンスを実現できます。 各サービスはシステムの機能に貢献しています。 トレースデータ依存関係、ボトルネック、サービスの健全性を強調するために必要な包括的なシステム ビューを提供します。 このビューは、分散システムのトラブルシューティング、パフォーマンスの最適化、信頼性の確保に不可欠です。

トレースデータがなければ、問題の解決は不正確になり、時間がかかってしまう可能性があります:

  • 可視性の欠如: トレースデータがなければ、リクエストの正確な流れやサービス間のやり取りを把握するのが困難になる可能性があります。 可視性の欠如により、問題が発生している場所や、それがシステム内でどのように波及しているかを特定することが難しくなります。
  • 限定的なコンテキスト:トレース データは、トランザクションに関係する各サービスのタイムスタンプ、依存関係、パフォーマンス メトリックなどの豊富なコンテキストを提供します。 このコンテキストがなければ、トラブルシューティングは具体的な証拠ではなく推測に依存することになります。
  • 手動調査:自動化されたトレース データがなければ、問題を解決するには、多くの場合、複数のサービスにわたるログの手動調査と相関関係の調査が必要になります。 このプロセスは労働集約的であり、人為的エラーが発生しやすくなります。
  • ダウンタイムの長期化: 問題の特定と解決に時間がかかるほど、アプリケーションの稼働時間やユーザー体験に与える影響は大きくなります。 正確な問題解決により、ダウンタイムが最小限に抑えられ、サービスの信頼性が維持されます。

以下の詳細情報をもとに、システム内のどのサービスにトレースデータが存在するか、またその取得方法を特定することができます。

用語

『 Instana 』では、「トレース」、「コール」、「スパン」という用語が、分散アプリケーションの監視とトレースに関するさまざまな側面を表すために使用されています:

  • 痕跡複数の呼び出しとサービス間のスパンから構成される、システム全体にわたるリクエストの流れです。
  • 電話トレースに寄与する、サービス間の特定の個別の相互作用または通信です。
  • スパンサービス内の特定の操作またはタスクの詳細な記録であり、その実行に関する詳細な情報を提供します。

これらの概念を組み合わせることで、分散アプリケーション内のフロー、パフォーマンス、相互作用を理解し、システムの健全性を包括的に把握して、効果的な監視、トラブルシューティング、最適化を実現できるようになります。

API エンドポイント

次の例では、エンドポイントの 「Application Resources 」グループにある2つの異なる API エンドポイントが使用されています。

エンドポイント 説明 資料 必要なアクセス権
GET /api/application-monitoring/applications Instana によって監視されているアプリケーションの一覧を取得します。ここから、サービスのリストなど、詳細情報を確認したい application_id アプリケーションを選択できます。 アプリケーションを取得する 「一般用途」の許可
GET /api/application-monitoring/analyze/call-groups 特定のアプリケーションのすべてのサービスを取得します(存在する場合)。application_id グループ化された通話メトリックを取得する 「一般用途」の許可

チュートリアル

Instana で、特定のアプリケーションのトレースデータを持つサービスのリストを取得するには、次の 2 つの手順が必要です:

  1. アプリケーションIDを取得する
  2. アプリケーションのトレースデータを持つサービスを取得する

アプリケーションIDの取得

アプリケーションのすべてのサービスを一覧表示するには、「/api/application-monitoring/applications」エンドポイントに GET リクエストを送信する必要があります。

上記の GET リクエストには次の詳細が含まれています。

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

トレースデータを含むサービスの取得

アプリケーション ID が利用可能な場合、エンド /api/application-monitoring/analyze/call-groups ポイントにリクエスト POST を送信することで、サービスのリストを取得できます。

上記の GET リクエストには次の詳細が含まれています。

POST /api/application-monitoring/analyze/call-groups
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/analyze/call-groups
  -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 のサンプルコード

特定のアプリケーションのサービス一覧をプログラムで自動的に取得するには、 Python 関数を使用してみてください。この関数は、ライブラリ requests を利用して、 GET grouped call metrics エンドポイント経由で指定されたアプリケーションのすべてのサービスを取得します。

ローカルマシンに Python 環境がセットアップされていない場合は、 Google Colab の「 Jupyter Notebook 」を使用してこの関数を試すことができます。これは、ブラウザ上で Python コードを記述・実行できる環境を提供するものです。 使用するにはGoogleColab、必要なのはGoogleアカウント。 このリンクから、Colabで Jupyter Notebook を作成してください。

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

# import the required libraries
import requests
import json

def get_services_with_traces(base_url, api_token, application_id):
    """
    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"{base-url}/api/application-monitoring/analyze/call-groups"

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

    #
    data = {
      "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"
      }
    }

    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_application_services次のように機能します。

BASE_URL = "https://{your_tenant}-{your_unit}.instana.io"
API_TOKEN = "{your_api_token}"
APPLICATION_ID = "{application_id}"

services = get_services_with_traces(BASE_URL, API_TOKEN, APPLICATION_ID)

if services is not None:
     print(services)

サンプル応答

API メソッドを呼び出すと、以下のコードブロックに示すような「 JSON 」というレスポンスが返ってくる場合があります。 {application_id} 向けのサービスで、トレースデータが提供されているものは、この items リストに記載されています。 次の例では、トレースデータを持つ「サービスA」と「サービスB」の2つのサービスがあります。

  {
  "items": [
    {
      "name": "Service A",
      "timestamp": 1720076400000,
      "cursor": {
        "@class": ".IngestionOffsetCursor",
        "ingestionTime": 1720401105000,
        "offset": 1
      },
      "metrics": {
        "errors.mean": [
          [
            1720080000000,
            0.0
          ]
        ],
        "calls.sum": [
          [
            1720080000000,
            200
          ]
        ],
        "latency.mean": [
          [
            1720080000000,
            0.500
          ]
        ]
      }
    },
    {
      "name": "Service B",
      "timestamp": 1720076400000,
      "cursor": {
        "@class": ".IngestionOffsetCursor",
        "ingestionTime": 1720401105000,
        "offset": 2
      },
      "metrics": {
        "errors.mean": [
          [
            1720080000000,
            1.5
          ]
        ],
        "calls.sum": [
          [
            1720080000000,
            150
          ]
        ],
        "latency.mean": [
          [
            1720080000000,
            2.200
          ]
        ]
      }
    }
    // More services...
  ],
  "canLoadMore": false,
  "totalHits": 2,
  "totalRepresentedItemCount": 2,
  "totalRetainedItemCount": 2,
  "adjustedTimeframe": {
    "windowSize": 3600000,
    "to": 1720080000000
  }
}

まとめと参考資料

アプリケーションのパフォーマンスを効果的に監視・最適化するためには、 Instana のトレースデータにアクセスし、それを解釈する方法を習得する必要があります。 Instana の API は、トレースデータの照会、ユーザーによる問題の診断、システムパフォーマンスの最適化、および分散アプリケーションの信頼性確保を支援します。

Instana がトレースおよび呼び出しに対して提供するデータと分析に関する詳細については、「 トレースと呼び出しの分析 」を参照してください。

API の使用方法やベストプラクティスに関する詳細については、 API のドキュメントを参照してください。

あなたも参加できますIBMTechXchangeコミュニティ