Splunk Observability Cloud 用に Node.js アプリケーションを手動でインストルメンテーションする

スパンにカスタム属性を追加する必要がある場合、またはスパンとメトリクスを手動で生成する必要がある場合は、Node.js アプリケーションを手動でインストルメンテーションします。Splunk Observability Cloud 用に .Node.js アプリケーションをインストルメンテーションする方法については、続きをお読みください。

Splunk Distribution of OpenTelemetry Node.js のエージェントを使ってアプリケーションを自動的にインストルメンテーションすれば、ほとんどのニーズに対応できます。アプリケーションを手動でインストルメンテーションする必要があるのは、たとえば、スパンにカスタム属性を追加する必要があるときや、スパンを手動で生成する必要があるときだけです。

注: 手動 OTel インストルメンテーションは、Splunk の自動 Node.js インストルメンテーションと完全に互換性があり、Splunk によって完全にサポートされています。

カスタムトレース

カスタムトレースを Splunk Observability Cloud に送信するには、必要な依存関係を追加し、トレースを設定します:

const { start } = require('@splunk/otel');
const opentelemetry = require('@opentelemetry/api');

start({
  serviceName: 'my-service',
});

const tracer = opentelemetry.trace.getTracer('example-app', '0.1.0');

function randomNumber() {
  return tracer.startActiveSpan('make-random', (span) => {
    const result = Math.random() * 42;
    span.setAttribute('random-result', result);
    span.end();
    return result;
  });
}

setInterval(() => {
  console.log(randomNumber());
}, 1000);
注: 手動インストルメンテーションの例については、OpenTelemetry 公式ドキュメントの「手動インストルメンテーション」を参照してください。

カスタムメトリクス

カスタムアプリケーションメトリクスを Splunk Observability Cloud に送信するには、依存関係に @opentelemetry/api を追加します:

const { start } = require('@splunk/otel');
const { Resource } = require('@opentelemetry/resources');
const { metrics } = require('@opentelemetry/api');

// All fields are optional.
start({
  // Takes preference over OTEL_SERVICE_NAME environment variable
  serviceName: 'my-service',
  metrics: {
    // The suggested resource is filled in using OTEL_RESOURCE_ATTRIBUTES
    resourceFactory: (suggestedResource: Resource) => {
      return suggestedResource.merge(new Resource({
        'my.property': 'xyz',
        'build': 42,
      }));
    },
    exportIntervalMillis: 1000, // default: 5000
    // The default exporter used is OTLP over gRPC
    endpoint: 'http://collector:4317',
  },
});

const meter = metrics.getMeter('my-meter');
const counter = meter.createCounter('clicks');
counter.add(3);

カスタムメトリクスリーダーとエクスポーターの設定

metricReaderFactory 設定を使用して、カスタム・エクスポーターとカスタム・リーダーを提供することができます。

注意: metricReaderFactory の使用は、exportIntervalendpoint の設定を無効にします。

次の例は、カスタム・エクスポーターを提供する方法を示しています:

const { start } = require('@splunk/otel');
const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http');
const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics-base');

start({
  serviceName: 'my-service',
  metrics: {
    metricReaderFactory: () => {
      return [
        new PrometheusExporter(),
        new PeriodicExportingMetricReader({
          exportIntervalMillis: 1000,
          exporter: new OTLPMetricExporter({ url: 'http://localhost:4318' })
        })
      ]
    },
  },
});

集計時間のタイプを選択する

集計の時間性は、データがどのように時系列で報告されるかを表します。

2つの異なる集計時間を定義できます:

  • AggregationTemporality.CUMULATIVE:カウンタやヒストグラムのような累積メトリクスは、任意の開始点から連続的に合計されます。この場合、start の呼び出しで設定されます。これがデフォルトの一時性です。

  • AggregationTemporality.DELTA:メトリクスは、エクスポート間隔によって設定される最後のメトリクス収集ステップからの相対値で合計されます。

カスタムメトリクスで集計の一時性を構成するには、例のように AggregationTemporality を使用します:

const { start } = require('@splunk/otel');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-grpc');
const { AggregationTemporality, PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics-base');

start({
  serviceName: 'my-service',
  metrics: {
    metricReaderFactory: () => {
      return [
        new PeriodicExportingMetricReader({
          exporter: new OTLPMetricExporter({
            temporalityPreference: AggregationTemporality.DELTA
          })
        })
      ]
    },
  },
});

集計の一時性についての詳細は、GitHub の「https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/data-model.md#sums」を参照してください。