Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenTelemetryを使ってアプリケーションのメトリクスを取る / Kofu.なんか #...

Avatar for Azuki-bar Azuki-bar
August 16, 2025
110

OpenTelemetryを使ってアプリケーションのメトリクスを取る / Kofu.なんか #1 #kofuasterisk

https://houtoupm.connpass.com/event/357176/ でOpenTelemetryでメトリクスを取る話をしました。

Avatar for Azuki-bar

Azuki-bar

August 16, 2025
Tweet

Transcript

  1. お前だれ - X: @azukibar_D - GitHub: Azuki-bar - 株式会社はてなでアプリケーションエンジニア として働いています

    - toittaという生成AIを活用した発話分析ソリューション を作っています 2
  2. オブザーバビリティの実現? - サービスの状態(=Signals)を取る - メトリクス - トレース - ログ -

    (将来的には)プロファイル? - 取った状態を表現するプロトコル - データの命名規則 8
  3. オブザーバビリティの実現? - サービスの状態(=Signals)を取る - メトリクス - トレース - ログ -

    (将来的には)プロファイル? - 取った状態を表現するプロトコル - データの命名規則 9
  4. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 17
  5. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 18 PeriodicExportingMe tricReader メモリに抱えつつ、定 期的に外部へ送信する
  6. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 19 gRPCでメトリクスを吐 く実装
  7. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 20 4317でgRPCを、4318で HTTPをリッスンしている のが一般的
  8. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 21 今回は省略しているが、ト レースや自動計装する設定 もここに書く
  9. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 22 最後にstartする 省略しているが、 sdk.shutdown()もある
  10. APIを呼ぶ import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('default'); const counter = meter.createCounter('custom.foo'); counter.add(1); 23
  11. APIを呼ぶ import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('default'); const counter = meter.createCounter('custom.foo'); counter.add(1); 24 Meter(後述)を取得
  12. APIを呼ぶ import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('default'); const counter = meter.createCounter('custom.foo'); counter.add(1); 25 Counter, Gauge, Histogramから選んで、値を 記録するためのインスタンスを作る
  13. APIを呼ぶ import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('default'); const counter = meter.createCounter('custom.foo'); counter.add(1); 27 実際に値を記録する
  14. OTel SDKを初期化する import { NodeSDK } from '@opentelemetry/sdk-node'; import {

    PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'; const sdk = new NodeSDK({ metricReader: new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://127.0.0.1:4317', }), }), }); sdk.start(); 34 設定 エクスポート
  15. APIを呼ぶ(再掲) import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('foo'); const counter = meter.createCounter('custom.foo'); counter.add(1); 37
  16. APIを呼ぶ(再掲) import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('foo'); const counter = meter.createCounter('custom.foo'); counter.add(1); 40
  17. APIを呼ぶ(再掲) import * as OTel from '@opentelemetry/api'; const meter =

    OTel.metrics.getMeter('foo'); const counter = meter.createCounter('custom.foo'); counter.add(1); 41 どこからgetMeter しているの?
  18. getMeterの型定義 export declare class MetricsAPI { /** * Returns a

    meter from the global meter provider. */ getMeter(name: string, version?: string, options?: MeterOptions): Meter; } 42 https://github.com/open-telemetry/opentelemetry-js/blob/927032ffd956eac7 3d0a1a98212aded9bf8a0107/api/src/api/metrics.ts#L29-L77 より。一部改変
  19. 今後への宿題 - キーワードは聞いたけど知らない概念 - Semantic Conventions - OTel Collectorでどんなことできるの -

    OpenTelemetry実装への興味 - 他言語ではどうなっているのか - 自動計装はどうやって実装されているのか 51