「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > NestJS + Opentelemetry (Grafana クラウド)

NestJS + Opentelemetry (Grafana クラウド)

2024 年 8 月 22 日に公開
ブラウズ:633

Production環境でOpentelemetryを使用する

Opentelemetryをアプリケーションに設定し、ローカルにOtel CollectorとLoki、Tempo、Grafanaを浮かべてトレースを見ることができるのはこの前の投稿まで仕上げになった。

もう残ったのはローカルだけでなく、実際のP​​roduction環境でのtracingを見ることだ。

そのために必要なのは「クラウド上にLog, Traceを保存すること」だ。

方法

1. Opentelemetry Collector をデプロイする

Opentelemetry Collector(Loki、Tempoなど)をどこにでも置いておき、アプリケーションで撮影するOLTPのアドレスをこのCollectorに設定すればよい。

あるいはより良いScalabilityのためにLoad balancingのためのGatewayを置き、ゲートウェイからOLTPを受け取り、内部のCollectorsに渡す方法もある。

2. Grafana Alloyをインストールしてデプロイする

Grafana Alloyはグラファナによって提供されるconfigurableなopentelemetry collectorである。

Dockerで配布したり、既存のKubernatesを使用した場合は、新しいノードとして追加できます。

3. Collectorなしですぐに撃つ

CollectorなしでBackend(Loki、Tempo、Jaegerなど)にOLTPを直接送ってしまう方法だ。

BackendでGrafana CloudのLoki、Tempoを使用できるため、配布せずに迅速に導入できるという利点がある。

の代わりにCollectorを使用して得られるScalabilityやProcessingなどのメリットは消える。

採用: Collectorなしで撃つ

クールにCollectorを配布して書きたいのですが、既存のKubernetesも使わない環境でCollector別に配布して設定するのに時間がかかりすぎるようで、ただGrafana Cloudですぐに撮影する方法を選択しました。

事実実験用に導入してみるのだしスタートアップなので、scalabilityが大きく重要に作用せず(ロギングだから)何よりも早くしてみることができるので、ファンシーではないが良い意思決定だ。

コード

コードの変更は非常にシンプルです。 OLTPのエンドポイントとProtocolだけをうまく設定してください。

Tracer

import { OTLPTraceExporter as PROTOOTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto"; const oltpTraceExporter = new PROTOOTLPTraceExporter({ url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT "/v1/traces", headers: { Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION、 }, });

私たちが撮影したトレースを受け取るendpoint(grafana cloud)はhttp / protobufプロトコルを受け取るので、exporter-trace-otlp-protoからインポートして書き込む必要があります。

ロガー

const logExporter = new OTLPLogExporter({ url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT "/v1/logs", headers: { Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION、 }, });

Loggerは従来もHttpプロトコルを使っていたので、OTLPLogExporterはそのまま使用すればよい。

環境変数
import { OTLPTraceExporter as PROTOOTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";

const oltpTraceExporter = new PROTOOTLPTraceExporter({
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT   "/v1/traces",
  headers: {
    Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION,
  },
});
注:NestJSでは、環境変数はAppModuleを初期化するときに設定されるため、AppModuleを作成する前に完了する必要があるトレーサーとロガーの設定では使用できません。

dotenvを使用している場合は、最初に呼び出す必要があります。

// eslint-disable-next-line import/order import { config } from "dotenv"; // eslint-disable-next-line import/order import {getEnvFilePath} from "@/lib/utils/env-loader"; config(); // load env before loading tracer and logger // eslint-disable-next-line import/order import otelSDK from "./tracer"; // otelSDK should be imported before any other imports // eslint-disable-next-line import/order import createLogger from "./logger";
const logExporter = new OTLPLogExporter({
  url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT   "/v1/logs",
  headers: {
    Authorization: process.env.OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION,
  },
});
環境変数の値

ウングンを見つけるのは難しいので、よく従ってください。

グラパナ接続

右上のMy Accountをクリック

左側のNavbarのGRAFANA CLOUDの下のStack名をクリック(ない場合はnew stackで作成)
// eslint-disable-next-line import/order
import { config } from "dotenv";
// eslint-disable-next-line import/order
import { getEnvFilePath } from "@/lib/utils/env-loader";
config(); // load env before loading tracer and logger

// eslint-disable-next-line import/order
import otelSDK from "./tracer"; // otelSDK should be imported before any other imports
// eslint-disable-next-line import/order
import createLogger from "./logger";
'Manage your stack'画面でOpentelmetryカードのconfigureを押す

ここでOTEL_EXPORTER_OTLP_ENDPOINTを入手でき、

下のPassword / API TokenでGenerate Keyを押してキーを作成すると
  1. 環境変数の中のOTEL_EXPORTER_OTLP_HEADERSからBasicで始まる部分は、OTEL_EXPORTER_OTLP_HEADERS_AUTHORIZATION変数の値です。
  2. 環境変数を登録して実行します。
  3. グラパナクラウドの実行
  4. グラファナでGrafana Launchをクリックし、Exploreでデータを見てみましょう
リリースステートメント この記事は次の場所に転載されています: https://dev.to/siisee11/nestjs-opentelemetry-grafana-cloud-328f?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3