Browse Source

add "@opentelemetry/exporter-metrics-otlp-grpc" package

Syunsuke Komma 2 years ago
parent
commit
37fbd25e73
3 changed files with 60 additions and 13 deletions
  1. 1 0
      apps/app/package.json
  2. 35 13
      apps/app/src/server/crowi/index.js
  3. 24 0
      yarn.lock

+ 1 - 0
apps/app/package.json

@@ -83,6 +83,7 @@
     "@keycloak/keycloak-admin-client": "^18.0.0",
     "@opentelemetry/api": "^1.8.0",
     "@opentelemetry/auto-instrumentations-node": "^0.43.0",
+    "@opentelemetry/exporter-metrics-otlp-grpc": "^0.50.0",
     "@opentelemetry/exporter-trace-otlp-grpc": "^0.50.0",
     "@opentelemetry/sdk-metrics": "^1.22.0",
     "@opentelemetry/sdk-node": "^0.49.1",

+ 35 - 13
apps/app/src/server/crowi/index.js

@@ -6,10 +6,12 @@ import { createTerminus } from '@godaddy/terminus';
 import attachmentRoutes from '@growi/remark-attachment-refs/dist/server';
 import lsxRoutes from '@growi/remark-lsx/dist/server/index.cjs';
 import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
+import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';
 import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
 import { Resource } from '@opentelemetry/resources';
+import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
 import { NodeSDK } from '@opentelemetry/sdk-node';
-import { SimpleSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/sdk-trace-node';
+import { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-node';
 import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
 import mongoose from 'mongoose';
 import next from 'next';
@@ -464,19 +466,39 @@ Crowi.prototype.start = async function() {
   await this.init();
   await this.buildServer();
 
+  // setup OpenTelemetry
+  // see: https://opentelemetry.io/docs/languages/js/getting-started/nodejs/#setup
+  const newNodeSDKConfiguration = () => {
+    return {
+      resource: new Resource({
+        [SEMRESATTRS_SERVICE_NAME]: 'next-app',
+      }),
+      traceExporter: new OTLPTraceExporter({ url: 'http://otel-collector:4317' }),
+      metricReader: new PeriodicExportingMetricReader({
+        exporter: new OTLPMetricExporter({ url: 'http://otel-collector:4317' }),
+        exportIntervalMillis: 10000,
+      }),
+      instrumentations: [getNodeAutoInstrumentations({
+        // この module は大量の trace を生成するため、無効化する
+        // see: https://opentelemetry.io/docs/languages/js/libraries/#registration
+        '@opentelemetry/instrumentation-fs': {
+          enabled: false,
+        },
+      })],
+      // 全 trace の半分を出す
+      // see: https://opentelemetry.io/docs/languages/js/sampling/
+      sampler: new TraceIdRatioBasedSampler(0.5),
+    };
+  };
+
   // setup instrumentation for OpenTelemetry
-  const sdk = new NodeSDK({
-    resource: new Resource({
-      [SEMRESATTRS_SERVICE_NAME]: 'next-app',
-    }),
-    spanProcessor: new SimpleSpanProcessor(new OTLPTraceExporter({ url: 'http://otel-collector:4317' })),
-    instrumentations: [getNodeAutoInstrumentations({
-      '@opentelemetry/instrumentation-fs': {
-        enabled: false,
-      },
-    })],
-  });
-  sdk.start();
+  const sdk = new NodeSDK(newNodeSDKConfiguration());
+  await sdk.start();
+  // 以下の restart コードは動かない
+  // span/metrics ともに何も出なくなる
+  // await sdk.shutdown();
+  // const newSdk = new NodeSDK(newNodeSDKConfiguration());
+  // await newSdk.start();
 
   // setup Next.js
   this.nextApp = next({ dev });

+ 24 - 0
yarn.lock

@@ -3004,6 +3004,30 @@
   dependencies:
     "@opentelemetry/semantic-conventions" "1.23.0"
 
+"@opentelemetry/exporter-metrics-otlp-grpc@^0.50.0":
+  version "0.50.0"
+  resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.50.0.tgz#53497d2073941d9abd7616ea8d108007d549a3c4"
+  integrity sha512-TSJ5u/yljJ/A2RBDwBveA9vYU5ip1F6kRkCM2g55+BKyF+Wf3hHi3Y8MmH7yIXzTvbc+UuMQdqwNaoMwzJIPcw==
+  dependencies:
+    "@grpc/grpc-js" "^1.7.1"
+    "@opentelemetry/core" "1.23.0"
+    "@opentelemetry/exporter-metrics-otlp-http" "0.50.0"
+    "@opentelemetry/otlp-grpc-exporter-base" "0.50.0"
+    "@opentelemetry/otlp-transformer" "0.50.0"
+    "@opentelemetry/resources" "1.23.0"
+    "@opentelemetry/sdk-metrics" "1.23.0"
+
+"@opentelemetry/exporter-metrics-otlp-http@0.50.0":
+  version "0.50.0"
+  resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.50.0.tgz#fa804b8d300f3e9c1b6047f4a17949cfaed902db"
+  integrity sha512-DMilj0pTOGxeaRPvVBil/KugvLMV5l+GzoXEWBKXYGEnfNlX+huPeMpYl+zJJBtI3Coht2KArnNOLhs2wqA3yA==
+  dependencies:
+    "@opentelemetry/core" "1.23.0"
+    "@opentelemetry/otlp-exporter-base" "0.50.0"
+    "@opentelemetry/otlp-transformer" "0.50.0"
+    "@opentelemetry/resources" "1.23.0"
+    "@opentelemetry/sdk-metrics" "1.23.0"
+
 "@opentelemetry/exporter-trace-otlp-grpc@0.49.1":
   version "0.49.1"
   resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.49.1.tgz#97f9c14d5eaa01e8e18f5d7bfc9a0f5a409b5471"