Splunk APMでスパンタグを使ってスパンにコンテキストを追加する 🔗
スパンタグを追加することで、Splunk APMに送信するスパンのコンテキストを充実させることができます。スパンタグは、トレース内のスパンに関する追加的なメタデータを提供するキーと値のペアです。OpenTelemetryでは、スパンタグは attributes
です。
スパンにスパンタグを追加する方法は2つあります:
スパンタグを作成するようにアプリケーションのインストルメントを実行します。このオプションは、アプリケーション別レベルの柔軟性を最も高めます。方法については アプリケーションコードをインストルメントしてスパンにタグを追加する を参照してください。
Splunk Distribution of OpenTelemetry Collectorにデータを送信する際に、OpenTelemetry属性としてスパンタグをスパンに追加します。このオプションを使用すると、スパンタグをスパンに一括で追加できます。方法については Splunk Distribution of OpenTelemetry Collectorを使用してスパンタグを追加する を参照してください。
Splunk Distribution of OpenTelemetry Collectorを、複数サービスからのデータ収集を一元管理するためのゲートウェイとしてデプロイする場合、このCollectorを使用してスパンタグを定義し、その他のスパンタグを管理するように、アプリケーションをインストルメントするといいでしょう。
前提条件 🔗
スパンタグを追加するには、adminロールが必要です。
スパンタグの命名規則に従う 🔗
タグは、命名規則を使用することでさらに多くの価値を提供します。すべてのアプリケーションでの使用に向けて明確なタグ名を定義してください。出発点として、OpenTelemetryでは、スパンとトレースで使えるセマンティック規約の一式を提供しています。詳細は、GitHubの「OpenTelemetryのトレースのセマンティック規約」を参照してください。
スパンにタグを追加する 🔗
以下のセクションでは、スパンにタグを追加する2つの方法について説明します:
どこでスパンタグを追加するかを検討することから始めましょう。
注釈
どこでスパンタグを追加するかの判断
アプリケーションのインストルメンテーション経由でスパンにスパンタグを追加する場合、アプリケーションレベルのコントロールを最も高めることができます。この場合のトレードオフは、アプリケーションごとのインストルメンテーションを介して属性を追加するために、より時間がかかる可能性があるということです。
ダウンストリームのOpenTelemetry Collectorでスパンタグを追加すると、粒度を犠牲にして時間を節約できます。タグを追加するOpenTelemetry Collectorが受信するデータの100%にタグが適用される場合は、OpenTelemetry Collectorの設定ファイルでタグを追加するのが最速です。ただし、OpenTelemetry Collector経由でタグを受信するスパンを区別するロジックを適用する必要がある場合は、インストルメンテーション経由でアプリケーションレベルでタグを追加する方が速いでしょう。
例えば、K8sのデプロイメントにおいて、複数のアプリケーションが同じホスト上に存在するが、異なる環境(例えば、production
、development
、staging
)にあるという場合、インストルメンテーションライブラリを使用して deployment.environment
タグを設定することで、同じホストからのスパン間で環境を区別することができます。
deployment.environment
スパンタグを使用すると、APMの全エクスペリエンスをデプロイ環境別にフィルタリングできるため、特に便利です。Splunk APMの環境については、Splunk APMでデプロイ環境を設定する を参照してください。
アプリケーションコードをインストルメントしてスパンにタグを追加する 🔗
スパンタグを追加する際に、アプリケーションごとにタグを指定することができます。コードをインストルメントしてスパンタグや属性を作成する方法は、使用しているプログラミング言語やインストルメンテーションライブラリによって異なります。
以下の例は、既存のスパンにカスタムタグを作成する方法を示しています:
// Splunk Distribution of OpenTelemetry Java
import io.opentelemetry.api.trace.Span;
Span customizedSpan = Span.current();
customizedSpan.setAttribute("my.attribute","value");
// You can also set global tags using the OTEL_RESOURCE_ATTRIBUTES
// environment variable, which accepts a list of comma-separated key-value
// pairs. For example, key1:val1,key2:val2.
# Splunk Distribution of OpenTelemetry Python
from opentelemetry import trace
customizedSpan = trace.get_current_span()
customizedSpan.set_attribute("my.attribute", "value")
# You can also set global tags using the OTEL_RESOURCE_ATTRIBUTES
# environment variable, which accepts a list of comma-separated key-value
# pairs. For example, key1:val1,key2:val2.
// Splunk Distribution of OpenTelemetry JS
const { context, trace } = require('@opentelemetry/api');
// A span must already exist in the context
const customizedSpan = trace.getSpan(context.active());
customizedSpan.setAttribute('my.attribute', 'value');
// You can also set global tags using the OTEL_RESOURCE_ATTRIBUTES
// environment variable, which accepts a list of comma-separated key-value
// pairs. For example, key1:val1,key2:val2.
// Splunk Distribution of OpenTelemetry .NET
using var myActivity = MyActivitySource.StartActivity("SayHello");
activity?.SetTag("operation.value", 1);
activity?.SetTag("operation.name", "Saying hello!");
activity?.SetTag("operation.other-stuff", new int[] { 1, 2, 3 });
// You can also set global tags using the OTEL_RESOURCE_ATTRIBUTES
// environment variable, which accepts a list of comma-separated key-value
// pairs. For example, key1:val1,key2:val2.
import (
// ...
"go.opentelemetry.io/otel"
)
func myFunc(ctx context.Context) {
// Create a named tracer
tracer := otel.Tracer("example.com/myFunc")
// Create a span with custom attributes
ctx, span = tracer.Start(ctx, "attributesAtCreation", trace.WithAttributes(attribute.String("hello", "splunk")))
defer span.End()
// Add attributes after creation
span.SetAttributes(attribute.Bool("isTrue", true), attribute.String("stringAttr", "Hello there!"))
// Other activities
}
// You can also set global tags using the OTEL_RESOURCE_ATTRIBUTES
// environment variable, which accepts a list of comma-separated key-value
// pairs. For example, key1:val1,key2:val2.
# OpenTelemetry Ruby
require "opentelemetry/sdk"
current_span = OpenTelemetry::Trace.current_span
current_span.set_attribute("animals", ["elephant", "tiger"])
# You can also set global tags using the OTEL_RESOURCE_ATTRIBUTES
# environment variable, which accepts a list of comma-separated key-value
# pairs. For example, key1:val1,key2:val2.
<?php
// OpenTelemetry PHP
use SignalFx\GlobalTracer;
private function rollOnce() {
$parent = OpenTelemetry\API\Trace\Span::getCurrent();
$scope = $parent->activate();
try {
$span = $this->tracer->spanBuilder("rollTheDice")->startSpan();
$result = random_int(1, 6);
$span->setAttribute('dicelib.rolled', $result);
$span->end();
} finally {
$scope->detach();
}
return $result;
}
// You can also set global tags using the SIGNALFX_TRACE_GLOBAL_TAGS
// environment variable, which accepts a list of comma-separated key-value
// pairs. For example: key1:val1,key2:val2.
?>
Splunk Distribution of OpenTelemetry Collectorを使用してスパンタグを追加する 🔗
Splunk Distribution of OpenTelemetry Collector で受信したスパンにスパンタグを追加するには、OpenTelemetry Collectorの設定YAMLファイルで attributes
プロセッサーを使用します。
汎用属性プロセッサーは attributes
と呼ばれます。それ以降の attributes/<NAME>
プロセッサーには、 attributes
プロセッサーのインスタンスの名前が付きます。詳しくは 属性プロセッサー を参照してください。
以下の手順に従って、新しい属性プロセッサーを定義し、パイプラインに追加します:
希望のスパンタグを追加する属性プロセッサーを定義します。これには2つの方法があります:
insert
アクションを使用して、新しいキー値ペアを設定する。例えば、以下のコードサンプルは、キー
enduser.role
がまだ存在しないスパンに、enduser.role:"admin"
というキー値ペアを追加します:processors: ... attributes/setenduser.role: actions: - key: enduser.role value: "admin" action: insert
upsert
アクションを使用して、スパン内の既存のキーから値をコピーし、その値を新しいキーに追加して既存の値を上書きする。例えば、以下のコードサンプルは、既存の
myTenant
キーからtenant
キーに値をコピーし、tenant
キーの既存の値を上書きします:processors: ... attributes/settenant: actions: - key: tenant from_attribute: myTenant action: upsert作成した属性プロセッサーを、
pipelines
の下のプロセッサーリストに追加します。以下のコードサンプル内のattributes/settenant
プロセッサーの位置と同じように、batch
プロセッサーの後、queued_retry
プロセッサーの前に配置します:service: pipelines: traces: receivers: ... processors: [..., batch, attributes/settenant, queued_retry, ...] ...
ホスト固有のスパンタグはどこから来るのか 🔗
Splunk Distribution of OpenTelemetry Collectorは、各スパンがどのインフラストラクチャ コンポーネントを使用しているかを識別するために、すべてのスパンに host
スパンタグを自動で追加します。 host
スパンタグの値は、多くの場合、hostname
またはそのインフラストラクチャ コンポーネントの一意のリソース識別子です。
host
スパンタグにより、Splunk APMはインフラストラクチャの主要なメトリクスをレンダリングし、インフラストラクチャコンポーネントのデフォルトのダッシュボードにリンクすることができます。これにより、インフラストラクチャレベルでアプリケーションのパフォーマンスをより簡単に監視し、Splunk APMとSplunk Infrastructure Monitoringの相互作用を利用することができるようになります。
host
スパンタグの他にも、OpenTelemetry Collectorは、ホストのタイプに応じて、そのホスト上でキャプチャされたすべてのスパンに特定のスパンタグを自動的に追加します。これらの追加的なスパンタグは、各スパンが使用するインフラストラクチャコンポーネントに関する詳細情報を提供し、対応するインフラストラクチャのメトリクスをレンダリングし、基盤となるインフラストラクチャコンポーネントのより完全なダッシュボードにリンクします。
以下のテーブルは、ホスト固有のスパンタグの例を示しています:
スパンタグ |
説明 |
---|---|
|
クラウドプロバイダーに対する一意のリソース識別子。 |
|
Dockerコンテナに対する一意のリソース識別子。 |
|
Kubernetesクラスター内のリソースに対する一意のリソース識別子。 |
This page was last updated on 2024年02月27日.