Skip to content

Commit

Permalink
[Monitor-OpenTelemetry-Exporter] Add Performance Tests for the Export…
Browse files Browse the repository at this point in the history
…er (#27100)

### Packages impacted by this PR
@azure/monitor-opentelemetry-exporter

### Describe the problem that is addressed by this PR
Created perf tests for creating and exporting spans, metrics and logs.

### Checklists
- [x] Added impacted package name to the issue description
- [ ] Does this PR needs any fixes in the SDK Generator?** _(If so,
create an Issue in the
[Autorest/typescript](https://github.com/Azure/autorest.typescript)
repository and link it here)_
- [ ] Added a changelog (if necessary)
  • Loading branch information
JacksonWeber authored Sep 18, 2023
1 parent 1bee622 commit 5a60584
Show file tree
Hide file tree
Showing 12 changed files with 2,195 additions and 2,007 deletions.
3,995 changes: 1,989 additions & 2,006 deletions common/config/rush/pnpm-lock.yaml

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions rush.json
Original file line number Diff line number Diff line change
Expand Up @@ -2099,6 +2099,11 @@
"packageName": "@azure/arm-hybridconnectivity",
"projectFolder": "sdk/hybridconnectivity/arm-hybridconnectivity",
"versionPolicyName": "management"
},
{
"packageName": "@azure-tests/perf-monitor-opentelemetry",
"projectFolder": "sdk/monitor/perf-tests/monitor-opentelemetry",
"versionPolicyName": "test"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const options: AzureMonitorOpenTelemetryOptions = {
useAzureMonitor(options);

export async function main() {
// Ge Meter and create custom metric
// Get Meter and create custom metric
const meter = metrics.getMeter("testMeter");
const customCounter = meter.createCounter("TestCounter");
customCounter.add(1);
Expand Down
13 changes: 13 additions & 0 deletions sdk/monitor/perf-tests/monitor-opentelemetry/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
### Guide

1. Build the monitor-opentelemetry perf tests package `rush build -t perf-monitor-opentelemetry`.
2. Copy the `sample.env` file and name it as `.env`.
3. Create an Application Insights resource and populate the `.env` file with connectionString.
4. Run the tests as follows:

- Exporting Spans
- `npm run perf-test:node -- SpanExportTest --warmup 1 --iterations 1 --parallel 2 --duration 15`
- Exporting Metrics
- `npm run perf-test:node -- MetricExportTest --warmup 1 --iterations 1 --parallel 2 --duration 15`
- Exporting Logs
- `npm run perf-test:node -- LogExportTest --warmup 1 --iterations 1 --parallel 2 --duration 15`
52 changes: 52 additions & 0 deletions sdk/monitor/perf-tests/monitor-opentelemetry/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"name": "@azure-tests/perf-monitor-opentelemetry",
"sdk-type": "perf-test",
"version": "1.0.0",
"description": "",
"main": "",
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@azure/test-utils-perf": "^1.0.0",
"dotenv": "^16.0.0",
"uuid": "^8.3.0",
"@opentelemetry/api": "^1.5.0",
"@azure/monitor-opentelemetry": "^1.0.0-beta.4",
"@opentelemetry/api-logs": "^0.43.0",
"@opentelemetry/sdk-logs": "^0.43.0"
},
"devDependencies": {
"@types/uuid": "^8.0.0",
"@types/node": "^14.0.0",
"eslint": "^8.0.0",
"prettier": "^2.5.1",
"rimraf": "^3.0.0",
"tslib": "^2.2.0",
"ts-node": "^10.0.0",
"typescript": "~5.0.0"
},
"private": true,
"scripts": {
"perf-test:node": "npm run build && node dist-esm/index.spec.js",
"audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit",
"build": "npm run clean && tsc -p .",
"build:samples": "echo skipped",
"build:test": "echo skipped",
"check-format": "prettier --list-different --config ../../../../.prettierrc.json --ignore-path ../../../../.prettierignore \"test/**/*.ts\" \"*.{js,json}\"",
"clean": "rimraf dist dist-* types *.tgz *.log",
"format": "prettier --write --config ../../../../.prettierrc.json --ignore-path ../../../../.prettierignore \"test/**/*.ts\" \"*.{js,json}\"",
"integration-test:browser": "echo skipped",
"integration-test:node": "echo skipped",
"integration-test": "echo skipped",
"lint:fix": "eslint --no-eslintrc -c ../../../.eslintrc.internal.json package.json test --ext .ts --fix --fix-type [problem,suggestion]",
"lint": "eslint --no-eslintrc -c ../../../.eslintrc.internal.json package.json test --ext .ts",
"pack": "npm pack 2>&1",
"unit-test:browser": "echo skipped",
"unit-test:node": "echo skipped",
"unit-test": "echo skipped",
"test:browser": "echo skipped",
"test:node": "echo skipped",
"test": "echo skipped"
}
}
1 change: 1 addition & 0 deletions sdk/monitor/perf-tests/monitor-opentelemetry/sample.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
APPLICATIONINSIGHTS_CONNECTION_STRING=<your connection string>
10 changes: 10 additions & 0 deletions sdk/monitor/perf-tests/monitor-opentelemetry/test/index.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

import { createPerfProgram } from "@azure/test-utils-perf";
import { SpanExportTest } from "./spanExport.spec";
import { LogExportTest } from "./logExport.spec";
import { MetricExportTest } from "./metricExport.spec";

const perfProgram = createPerfProgram(SpanExportTest, LogExportTest, MetricExportTest);
perfProgram.run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

import { PerfOptionDictionary } from "@azure/test-utils-perf";
import { MonitorOpenTelemetryTest } from "./monitorOpenTelemetry.spec";
import { logs, SeverityNumber } from "@opentelemetry/api-logs";

type MonitorOpenTelemetryTestOptions = Record<string, unknown>;

export class LogExportTest extends MonitorOpenTelemetryTest<MonitorOpenTelemetryTestOptions> {
public options: PerfOptionDictionary<MonitorOpenTelemetryTestOptions> = {};
constructor() {
super();
}

async run(): Promise<void> {
try {
const logger = logs.getLogger("test-logger");
logger.emit({
severityText: "INFO",
severityNumber: SeverityNumber.INFO,
body: "test message",
attributes: { key: "value" },
});
} catch (error) {
console.error("Error running logs perf test:", error);
process.exit(1);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

import { PerfOptionDictionary } from "@azure/test-utils-perf";
import { MonitorOpenTelemetryTest } from "./monitorOpenTelemetry.spec";
import { metrics } from "@opentelemetry/api";

type MonitorOpenTelemetryTestOptions = Record<string, unknown>;

export class MetricExportTest extends MonitorOpenTelemetryTest<MonitorOpenTelemetryTestOptions> {
public options: PerfOptionDictionary<MonitorOpenTelemetryTestOptions> = {};
constructor() {
super();
}

async run(): Promise<void> {
const meter = metrics.getMeter("testMeter");
const customCounter = meter.createCounter("TestCounter");
customCounter.add(1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import { PerfTest } from "@azure/test-utils-perf";
import { useAzureMonitor, AzureMonitorOpenTelemetryOptions } from "@azure/monitor-opentelemetry";

import * as dotenv from "dotenv";
dotenv.config();

export abstract class MonitorOpenTelemetryTest<TOptions> extends PerfTest<TOptions> {
constructor() {
super();
const options: AzureMonitorOpenTelemetryOptions = {
azureMonitorExporterOptions: {
connectionString:
process.env["APPLICATIONINSIGHTS_CONNECTION_STRING"] || "<your connection string>",
},
};
useAzureMonitor(options);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

import { PerfOptionDictionary } from "@azure/test-utils-perf";
import { MonitorOpenTelemetryTest } from "./monitorOpenTelemetry.spec";
import { trace, Span, Tracer, context } from "@opentelemetry/api";

type MonitorOpenTelemetryTestOptions = Record<string, unknown>;

export class SpanExportTest extends MonitorOpenTelemetryTest<MonitorOpenTelemetryTestOptions> {
public options: PerfOptionDictionary<MonitorOpenTelemetryTestOptions> = {};
constructor() {
super();
}

async run(): Promise<void> {
async function main() {
const tracer = trace.getTracer("testTracer");
const parentSpan = tracer.startSpan("main");
doWork(parentSpan, tracer);
parentSpan.end();
}

function doWork(parent: Span, tracer: Tracer) {
const ctx = trace.setSpan(context.active(), parent);
const span = tracer.startSpan("doWork", undefined, ctx);
for (let i = 0; i <= 1; i += 1) {
continue;
}
span.setAttribute("key", "value");
span.addEvent("invoking doWork");
span.end();
}

main().catch((error) => {
console.error("Error running perf test:", error.message);
process.exit(1);
});
}
}
12 changes: 12 additions & 0 deletions sdk/monitor/perf-tests/monitor-opentelemetry/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"extends": "../../../../tsconfig.package",
"compilerOptions": {
"module": "commonjs",
"outDir": "./dist-esm",
"declarationDir": "./types",
"paths": {
"@azure/monitor-opentelemetry-exporter": ["./src/index"]
}
},
"include": ["src/**/*.ts", "test/**/*.ts", "samples-dev/**/*.ts"]
}

0 comments on commit 5a60584

Please sign in to comment.