Skip to content

Commit

Permalink
feat: add otel module
Browse files Browse the repository at this point in the history
  • Loading branch information
loopingz committed Nov 14, 2023
1 parent 852f233 commit 1841c28
Show file tree
Hide file tree
Showing 8 changed files with 573 additions and 0 deletions.
3 changes: 3 additions & 0 deletions packages/otel/.mocharc.json
@@ -0,0 +1,3 @@
{
"node-option": ["experimental-specifier-resolution=node", "loader=ts-node/esm"]
}
3 changes: 3 additions & 0 deletions packages/otel/README.md
@@ -0,0 +1,3 @@
# <%= name %>

<%= description %>
67 changes: 67 additions & 0 deletions packages/otel/package.json
@@ -0,0 +1,67 @@
{
"name": "@webda/otel",
"version": "3.0.0",
"description": "OpenTelemetry module",
"main": "lib/index.js",
"type": "module",
"scripts": {
"build": "webda build",
"pretest": "npm run build",
"test": "c8 mocha --recursive --exit --timeout=100000 src/**/*.spec.ts",
"test:debug": "mocha --recursive --exit --timeout=100000 src/**/*.spec.ts",
"new-model": "webda init webda:model",
"new-service": "webda init webda:service"
},
"keywords": [
"webda-module"
],
"files": [
"lib",
"webda.module.json",
"package.json"
],
"dependencies": {
"@opentelemetry/api": "^1.7.0",
"@opentelemetry/api-logs": "^0.45.1",
"@opentelemetry/auto-instrumentations-node": "^0.40.0",
"@opentelemetry/exporter-logs-otlp-grpc": "^0.45.1",
"@opentelemetry/exporter-metrics-otlp-proto": "^0.45.1",
"@opentelemetry/sdk-logs": "^0.45.1",
"@opentelemetry/sdk-metrics": "^1.18.1",
"@opentelemetry/sdk-node": "^0.45.1",
"@types/node": "^20.8.7",
"@webda/core": "^3.7.0"
},
"devDependencies": {
"@testdeck/mocha": "^0.3.3",
"@types/node": "^20.8.7",
"@webda/shell": "^3.5.0",
"c8": "^8.0.1",
"glob": "^10.3.10",
"js-beautify": "^1.14.9",
"mocha": "^10.2.0",
"prettier": "^3.0.3",
"source-map-support": "^0.5.21",
"ts-node": "^10.9.1",
"typescript": "^5.2.2"
},
"c8": {
"extends": "@istanbuljs/nyc-config-typescript",
"report-dir": "./reports",
"reporter": [
"html",
"lcov",
"json"
],
"exclude": [
"**/*.spec.ts",
"test/**/*"
]
},
"bugs": {
"url": "https://github.com/loopingz/webda.io/issues"
},
"homepage": "https://github.com/loopingz/webda.io#readme",
"repository": "git://github.com/loopingz/webda.io.git",
"license": "MIT"
}
2 changes: 2 additions & 0 deletions packages/otel/src/index.ts
@@ -0,0 +1,2 @@
// Export all objects from here to expose them to other modules
export * from "./otel";
84 changes: 84 additions & 0 deletions packages/otel/src/otel.spec.ts
@@ -0,0 +1,84 @@
import { DiagLogLevel, diag } from "@opentelemetry/api";
import { suite, test } from "@testdeck/mocha";
import { ResourceService, Service } from "@webda/core";
import { WebdaSimpleTest } from "@webda/core/lib/test";
import * as assert from "assert";
import { OtelLogger, OtelService } from "./otel";

class FakeService extends Service {
myRecursiveMethod(i: number = 0) {
if (i > 3) {
return 3;
}
return this.myRecursiveMethod(i + 1);
}

myFaultyMethod() {
throw new Error("Fake");
}
}

@suite
class OtelTest extends WebdaSimpleTest {
@test
async test() {
let resource = await this.registerService(
new ResourceService(this.webda, "ResourceService", { folder: "./src", url: "/" })
)
.resolve()
.init();
let fake = await this.registerService(new FakeService(this.webda, "fake", {}))
.resolve()
.init();
let service = await this.registerService(new OtelService(this.webda, "otel", {}))
.resolve()
.init();

let ctx = await this.newContext();
await this.execute(ctx, "test.webda.io", "GET", "/otel.ts");
fake.myRecursiveMethod();
assert.throws(() => fake.myFaultyMethod());
delete service.getParameters().traceExporter;
await service.reinit({ traceExporter: { type: "otlp", enable: false } });
await service.reinit({ traceExporter: { type: "otlp", enable: true } });
// Ensure to be able to stop
await service.stop();
}

@test
async otelLogger() {
let out = this.webda.getApplication().getWorkerOutput();
new OtelLogger({ emit: () => {} }, out);
out.log("INFO", "test");
await this.nextTick(2);
}

@test
async getDiagLevel() {
const service = new OtelService(this.webda, "otel", { diagnostic: "ALL" });
assert.strictEqual(service.getDiagLevel(), DiagLogLevel.ALL);

service.reinit({ diagnostic: "ERROR" });
assert.strictEqual(service.getDiagLevel(), DiagLogLevel.ERROR);

service.reinit({ diagnostic: "INFO" });
assert.strictEqual(service.getDiagLevel(), DiagLogLevel.INFO);

service.reinit({ diagnostic: "TRACE" });
assert.strictEqual(service.getDiagLevel(), DiagLogLevel.VERBOSE);

service.reinit({ diagnostic: "WARN" });
assert.strictEqual(service.getDiagLevel(), DiagLogLevel.WARN);

service.reinit({ diagnostic: "DEBUG" });
assert.strictEqual(service.getDiagLevel(), DiagLogLevel.DEBUG);

diag.verbose("test");
diag.debug("test");
diag.error("test");
diag.warn("test");
diag.info("test");

await this.nextTick(2);
}
}

0 comments on commit 1841c28

Please sign in to comment.