diff --git a/.gitmodules b/.gitmodules index ac506a776f..278e2d9a57 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,12 @@ -[submodule "experimental/packages/opentelemetry-exporter-otlp-proto/protos"] - path = experimental/packages/opentelemetry-exporter-otlp-proto/protos +[submodule "experimental/packages/opentelemetry-exporter-trace-otlp-proto/protos"] + path = experimental/packages/opentelemetry-exporter-trace-otlp-proto/protos url = https://github.com/open-telemetry/opentelemetry-proto.git -[submodule "experimental/packages/opentelemetry-exporter-otlp-grpc/protos"] - path = experimental/packages/opentelemetry-exporter-otlp-grpc/protos +[submodule "experimental/packages/opentelemetry-exporter-trace-otlp-grpc/protos"] + path = experimental/packages/opentelemetry-exporter-trace-otlp-grpc/protos + url = https://github.com/open-telemetry/opentelemetry-proto.git +[submodule "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos"] + path = experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos + url = https://github.com/open-telemetry/opentelemetry-proto.git +[submodule "experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos"] + path = experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos url = https://github.com/open-telemetry/opentelemetry-proto.git diff --git a/README.md b/README.md index d6cbe69d9c..e78162d7b8 100644 --- a/README.md +++ b/README.md @@ -288,6 +288,12 @@ To request automatic tracing support for a module not on this list, please [file ### 0.26.x to 0.27.x +Metric and trace exporters are split into separate packages: + +- `@opentelemetry/exporter-otlp-http` => `@opentelemetry/exporter-trace-otlp-http` and `@opentelemetry/exporter-metrics-otlp-http` +- `@opentelemetry/exporter-otlp-grpc` => `@opentelemetry/exporter-trace-otlp-grpc` and `@opentelemetry/exporter-metrics-otlp-grpc` +- `@opentelemetry/exporter-otlp-proto` => `@opentelemetry/exporter-trace-otlp-proto` and `@opentelemetry/exporter-metrics-otlp-proto` + Metric types are renamed: - `@openetelemetry/api-metrics` diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintignore b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/.eslintignore similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintignore rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/.eslintignore diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/.eslintrc.js similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/.eslintrc.js rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/.eslintrc.js diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/.npmignore b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/.npmignore similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/.npmignore rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/.npmignore diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/LICENSE b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/LICENSE similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/LICENSE rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/LICENSE diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/README.md b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/README.md new file mode 100644 index 0000000000..007c36f86f --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/README.md @@ -0,0 +1,77 @@ +# OpenTelemetry Collector Metrics Exporter for node with grpc + +[![NPM Published Version][npm-img]][npm-url] +[![dependencies][dependencies-image]][dependencies-url] +[![devDependencies][devDependencies-image]][devDependencies-url] +[![Apache License][license-image]][license-image] + +This module provides exporter for web and node to be used with [opentelemetry-collector][opentelemetry-collector-url] - last tested with version **0.25.0**. + +## Installation + +```bash +npm install --save @opentelemetry/exporter-metrics-otlp-grpc +``` + +## Service Name + +The OpenTelemetry Collector Exporter does not have a service name configuration. +In order to set the service name, use the `service.name` resource attribute as prescribed in the [OpenTelemetry Resource Semantic Conventions][semconv-resource-service-name]. +To see sample code and documentation for the traces exporter, as well as instructions for using TLS, visit the [Collector Trace Exporter for web and node][trace-exporter-url]. + +## Metrics in Node - GRPC + +The OTLPTraceExporter in Node expects the URL to only be the hostname. It will not work with `/v1/metrics`. All options that work with trace also work with metrics. + +```js +const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); +const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-grpc'); +const collectorOptions = { + // url is optional and can be omitted - default is grpc://localhost:4317 + url: 'grpc://:', +}; +const exporter = new OTLPMetricExporter(collectorOptions); + +// Register the exporter +const provider = new MeterProvider({ + exporter, + interval: 60000, +}) +['SIGINT', 'SIGTERM'].forEach(signal => { + process.on(signal, () => provider.shutdown().catch(console.error)); +}); + +// Now, start recording data +const meter = provider.getMeter('example-meter'); +const counter = meter.createCounter('metric_name'); +counter.add(10, { 'key': 'value' }); +``` + +## Running opentelemetry-collector locally to see the metrics + +1. Go to examples/otlp-exporter-node +2. run `npm run docker:start` +3. Open page at `http://localhost:9411/zipkin/` to observe the metrics + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-grpc +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-grpc +[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-grpc&type=dev +[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-grpc&type=dev +[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-metrics-otlp-grpc +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-metrics-otlp-grpc.svg +[opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector +[semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[trace-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-trace-otlp-grpc diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json new file mode 100644 index 0000000000..becd3e6ee1 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/package.json @@ -0,0 +1,79 @@ +{ + "name": "@opentelemetry/exporter-metrics-otlp-grpc", + "version": "0.26.0", + "description": "OpenTelemetry Collector Metrics Exporter allows user to send collected metrics to the OpenTelemetry Collector", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "open-telemetry/opentelemetry-js", + "scripts": { + "compile": "tsc --build", + "clean": "tsc --build --clean", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "postcompile": "npm run submodule && npm run protos:copy", + "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", + "submodule": "git submodule sync --recursive && git submodule update --init --recursive", + "tdd": "npm run test -- --watch-extensions ts --watch", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", + "version": "node ../../../scripts/version-update.js", + "watch": "npm run protos:copy && tsc -w", + "precompile": "lerna run version --scope $(npm pkg get name) --include-filtered-dependencies", + "prewatch": "npm run precompile" + }, + "keywords": [ + "opentelemetry", + "nodejs", + "grpc", + "tracing", + "profiling", + "metrics", + "stats" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "build/protos/**/*.proto", + "doc", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@babel/core": "7.15.0", + "@opentelemetry/api": "^1.0.3", + "@opentelemetry/api-metrics": "0.26.0", + "@types/mocha": "8.2.3", + "@types/node": "14.17.11", + "@types/sinon": "10.0.2", + "codecov": "3.8.3", + "cpx": "1.5.0", + "mocha": "7.2.0", + "nyc": "15.1.0", + "rimraf": "3.0.2", + "sinon": "11.1.2", + "ts-loader": "8.3.0", + "ts-mocha": "8.0.0", + "typescript": "4.3.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.3" + }, + "dependencies": { + "@grpc/grpc-js": "^1.3.7", + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.26.0", + "@opentelemetry/exporter-trace-otlp-http": "0.26.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.26.0", + "@opentelemetry/sdk-metrics-base": "0.26.0", + "@opentelemetry/resources": "1.0.0" + } +} diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/protos b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/protos rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/protos diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts similarity index 84% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts index a914c299cd..1816992850 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/OTLPMetricExporter.ts @@ -14,15 +14,16 @@ * limitations under the License. */ -import { - otlpTypes, - toOTLPExportMetricServiceRequest, -} from '@opentelemetry/exporter-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { toOTLPExportMetricServiceRequest } from '@opentelemetry/exporter-metrics-otlp-http' import { MetricRecord, MetricExporter } from '@opentelemetry/sdk-metrics-base'; -import { OTLPExporterConfigNode, ServiceClientType } from './types'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; +import { + OTLPExporterConfigNode, + OTLPExporterNodeBase, + ServiceClientType, + validateAndNormalizeUrl +} from '@opentelemetry/exporter-trace-otlp-grpc'; import { baggageUtils, getEnv } from '@opentelemetry/core'; -import { validateAndNormalizeUrl } from './util'; import { Metadata } from '@grpc/grpc-js'; const DEFAULT_COLLECTOR_URL = 'localhost:4317'; @@ -58,7 +59,7 @@ export class OTLPMetricExporter ); } - getDefaultUrl(config: OTLPExporterConfigNode) { + getDefaultUrl(config: OTLPExporterConfigNode): string { return typeof config.url === 'string' ? validateAndNormalizeUrl(config.url) : getEnv().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length > 0 @@ -68,7 +69,7 @@ export class OTLPMetricExporter : DEFAULT_COLLECTOR_URL; } - getServiceClientType() { + getServiceClientType(): ServiceClientType { return ServiceClientType.METRICS; } diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/index.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/index.ts similarity index 94% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/src/index.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/index.ts index d54490a7ea..7b73804ce4 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/index.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/src/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './OTLPTraceExporter'; export * from './OTLPMetricExporter'; diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/submodule.md b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/submodule.md new file mode 100644 index 0000000000..4985e69dad --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/submodule.md @@ -0,0 +1,45 @@ +# Important + +**Submodule is always pointing to certain revision number. So updating the submodule repo will not have impact on your code. +Knowing this if you want to change the submodule to point to a different version (when for example proto has changed) here is how to do it:** + +## Updating submodule to point to certain revision number + +1. Make sure you are in the same folder as this instruction + +2. Update your submodules by running this command + + ```shell script + git submodule sync --recursive + git submodule update --init --recursive + ``` + +3. Find the commit SHA which you want to update to and copy it (the long one) + +4. Enter a submodule directory from this directory + + ```shell script + cd protos + ``` + +5. Updates files in the submodule tree to given commit: + + ```shell script + git checkout -q + ``` + +6. Return to the main directory: + + ```shell script + cd ../ + ``` + +7. Please run `git status` you should see something like `Head detached at`. This is correct, go to next step + +8. Now thing which is very important. You have to commit this to apply these changes + + ```shell script + git commit -am "chore: updating submodule for opentelemetry-proto" + ``` + +9. If you look now at git log you will notice that the folder `protos` has been changed and it will show what was the previous sha and what is current one. diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts index 83d8723d4f..569bd2e500 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/OTLPMetricExporter.test.ts @@ -21,7 +21,7 @@ import { Histogram, } from '@opentelemetry/api-metrics'; import { diag } from '@opentelemetry/api'; -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import * as metrics from '@opentelemetry/sdk-metrics-base'; import * as assert from 'assert'; import * as fs from 'fs'; @@ -38,7 +38,7 @@ import { mockCounter, mockObservableGauge, mockHistogram, -} from './helper'; +} from './metricsHelper'; const metricsServiceProtoPath = 'opentelemetry/proto/collector/metrics/v1/metrics_service.proto'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/ca.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.crt rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/ca.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/ca.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/ca.key rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/ca.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/client.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.crt rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/client.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/client.csr similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.csr rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/client.csr diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.key b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/client.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/client.key rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/client.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/regenerate.sh similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/regenerate.sh rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/regenerate.sh diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/server.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.crt rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/server.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/server.csr similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.csr rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/server.csr diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.key b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/server.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/certs/server.key rename to experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/certs/server.key diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts new file mode 100644 index 0000000000..7fd582968d --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/test/metricsHelper.ts @@ -0,0 +1,251 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Counter, + ObservableResult, + ObservableGauge, + Histogram, + ValueType, +} from '@opentelemetry/api-metrics'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import * as metrics from '@opentelemetry/sdk-metrics-base'; +import { Resource } from '@opentelemetry/resources'; +import * as assert from 'assert'; +import * as grpc from '@grpc/grpc-js'; +import { VERSION } from '@opentelemetry/core'; + +const meterProvider = new metrics.MeterProvider({ + interval: 30000, + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), +}); + +const meter = meterProvider.getMeter('default', '0.0.1'); + +export function mockCounter(): metrics.Metric & Counter { + const name = 'int-counter'; + const metric = + meter['_metrics'].get(name) || + meter.createCounter(name, { + description: 'sample counter description', + valueType: ValueType.INT, + }); + metric.clear(); + metric.bind({}); + return metric; +} + +export function mockObservableGauge( + callback: (observableResult: ObservableResult) => void +): metrics.Metric & ObservableGauge { + const name = 'double-observable-gauge'; + const metric = + meter['_metrics'].get(name) || + meter.createObservableGauge( + name, + { + description: 'sample observable gauge description', + valueType: ValueType.DOUBLE, + }, + callback + ); + metric.clear(); + metric.bind({}); + return metric; +} + +export function mockHistogram(): metrics.Metric & + Histogram { + const name = 'int-histogram'; + const metric = + meter['_metrics'].get(name) || + meter.createHistogram(name, { + description: 'sample histogram description', + valueType: ValueType.INT, + boundaries: [0, 100], + }); + metric.clear(); + metric.bind({}); + return metric; +} + +export function ensureExportedAttributesAreCorrect( + attributes: otlpTypes.opentelemetryProto.common.v1.KeyValue[] +) { + assert.deepStrictEqual( + attributes, + [ + { + key: 'component', + value: { + stringValue: 'document-load', + value: 'stringValue', + }, + }, + ], + 'exported attributes are incorrect' + ); +} + +export function ensureExportedCounterIsCorrect( + metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, + time?: number +) { + assert.deepStrictEqual(metric, { + name: 'int-counter', + description: 'sample counter description', + unit: '1', + data: 'intSum', + intSum: { + dataPoints: [ + { + labels: [], + exemplars: [], + value: '1', + startTimeUnixNano: '1592602232694000128', + timeUnixNano: String(time), + }, + ], + isMonotonic: true, + aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', + }, + }); +} + +export function ensureExportedObservableGaugeIsCorrect( + metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, + time?: number +) { + assert.deepStrictEqual(metric, { + name: 'double-observable-gauge', + description: 'sample observable gauge description', + unit: '1', + data: 'doubleGauge', + doubleGauge: { + dataPoints: [ + { + labels: [], + exemplars: [], + value: 6, + startTimeUnixNano: '1592602232694000128', + timeUnixNano: String(time), + }, + ], + }, + }); +} + +export function ensureExportedHistogramIsCorrect( + metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, + time?: number, + explicitBounds: number[] = [Infinity], + bucketCounts: string[] = ['2', '0'] +) { + assert.deepStrictEqual(metric, { + name: 'int-histogram', + description: 'sample histogram description', + unit: '1', + data: 'intHistogram', + intHistogram: { + dataPoints: [ + { + labels: [], + exemplars: [], + sum: '21', + count: '2', + startTimeUnixNano: '1592602232694000128', + timeUnixNano: String(time), + bucketCounts, + explicitBounds, + }, + ], + aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', + }, + }); +} + +export function ensureResourceIsCorrect( + resource: otlpTypes.opentelemetryProto.resource.v1.Resource +) { + assert.deepStrictEqual(resource, { + attributes: [ + { + 'key': 'service.name', + 'value': { + 'stringValue': `unknown_service:${process.argv0}`, + 'value': 'stringValue' + } + }, + { + 'key': 'telemetry.sdk.language', + 'value': { + 'stringValue': 'nodejs', + 'value': 'stringValue' + } + }, + { + 'key': 'telemetry.sdk.name', + 'value': { + 'stringValue': 'opentelemetry', + 'value': 'stringValue' + } + }, + { + 'key': 'telemetry.sdk.version', + 'value': { + 'stringValue': VERSION, + 'value': 'stringValue' + } + }, + { + key: 'service', + value: { + stringValue: 'ui', + value: 'stringValue', + }, + }, + { + key: 'version', + value: { + intValue: '1', + value: 'intValue', + }, + }, + { + key: 'cost', + value: { + doubleValue: 112.12, + value: 'doubleValue', + }, + }, + ], + droppedAttributesCount: 0, + }); +} + +export function ensureMetadataIsCorrect( + actual: grpc.Metadata, + expected: grpc.Metadata +) { + //ignore user agent + expected.remove('user-agent'); + actual.remove('user-agent'); + assert.deepStrictEqual(actual.getMap(), expected.getMap()); +} diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json new file mode 100644 index 0000000000..948abef3ce --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "references": [ + { + "path": "../opentelemetry-api-metrics" + } + ] +} diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/.eslintignore b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/.eslintignore similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/.eslintignore rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/.eslintignore diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/.eslintrc.js b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/.eslintrc.js similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/.eslintrc.js rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/.eslintrc.js diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/.npmignore b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/.npmignore similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/.npmignore rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/.npmignore diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/LICENSE b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/LICENSE similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/LICENSE rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/LICENSE diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/README.md b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/README.md new file mode 100644 index 0000000000..791d1acb10 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/README.md @@ -0,0 +1,131 @@ +# OpenTelemetry Collector Metrics Exporter for web and node + +[![NPM Published Version][npm-img]][npm-url] +[![dependencies][dependencies-image]][dependencies-url] +[![devDependencies][devDependencies-image]][devDependencies-url] +[![Apache License][license-image]][license-image] + +This module provides exporter for web and node to be used with [opentelemetry-collector][opentelemetry-collector-url] - last tested with version **0.25.0**. + +## Installation + +```bash +npm install --save @opentelemetry/exporter-metrics-otlp-http +``` + +## Service Name + +The OpenTelemetry Collector Metrics Exporter does not have a service name configuration. +In order to set the service name, use the `service.name` resource attribute as prescribed in the [OpenTelemetry Resource Semantic Conventions][semconv-resource-service-name]. +To see sample code and documentation for the traces exporter, visit the [Collector Trace Exporter for web and node][trace-exporter-url]. + +## Metrics in Web + +The OTLPMetricExporter in Web expects the endpoint to end in `/v1/metrics`. + +```js +import { MeterProvider } from '@opentelemetry/sdk-metrics-base'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +const collectorOptions = { + url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/metrics + headers: {}, // an optional object containing custom headers to be sent with each request + concurrencyLimit: 1, // an optional limit on pending requests +}; +const exporter = new OTLPMetricExporter(collectorOptions); + +// Register the exporter +const meter = new MeterProvider({ + exporter, + interval: 60000, +}).getMeter('example-meter'); + +// Now, start recording data +const counter = meter.createCounter('metric_name'); +counter.add(10, { 'key': 'value' }); + +``` + +## Metrics in Node + +```js +const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); +const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http'); +const collectorOptions = { + url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/metrics + concurrencyLimit: 1, // an optional limit on pending requests +}; +const exporter = new OTLPMetricExporter(collectorOptions); + +// Register the exporter +const meter = new MeterProvider({ + exporter, + interval: 60000, +}).getMeter('example-meter'); + +// Now, start recording data +const counter = meter.createCounter('metric_name'); +counter.add(10, { 'key': 'value' }); + +``` + +## GRPC + +For exporting metrics with GRPC please check [exporter-metrics-otlp-grpc][npm-url-grpc] + +## PROTOBUF + +For exporting metrics with PROTOBUF please check [exporter-metrics-otlp-proto][npm-url-proto] + +## Configuration options as environment variables + +Instead of providing options to `OTLPMetricExporter` and `OTLPTraceExporter` explicitly, environment variables may be provided instead. + +```sh +OTEL_EXPORTER_OTLP_ENDPOINT=https://localhost:4317 +# this will automatically append the version and signal path +# e.g. https://localhost:4317/v1/traces for `OTLPTraceExporter` and https://localhost:4317/v1/metrics for `OTLPMetricExporter` +``` + +If the trace and metric exporter endpoints have different providers, the env var for per-signal endpoints are available to use + +```sh +OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://trace-service:4317/v1/traces +OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=https://metric-service:4317/v1/metrics +# version and signal needs to be explicit +``` + +> The per-signal endpoints take precedence and overrides `OTEL_EXPORTER_OTLP_ENDPOINT` + +For more details, see [OpenTelemetry Specification on Protocol Exporter][opentelemetry-spec-protocol-exporter]. + +## Running opentelemetry-collector locally to see the metrics + +1. Go to examples/otlp-exporter-node +2. run `npm run docker:start` +3. Open page at `http://localhost:9411/zipkin/` to observe the metrics + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-http +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-http +[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-http&type=dev +[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-http&type=dev +[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-metrics-otlp-http +[npm-url-grpc]: https://www.npmjs.com/package/@opentelemetry/exporter-metrics-otlp-grpc +[npm-url-proto]: https://www.npmjs.com/package/@opentelemetry/exporter-metrics-otlp-proto +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-metrics-otlp-http.svg +[opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector +[opentelemetry-spec-protocol-exporter]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options +[semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[trace-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-trace-otlp-http diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/karma.conf.js b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/karma.conf.js similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/karma.conf.js rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/karma.conf.js diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json new file mode 100644 index 0000000000..e1979a7a8f --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/package.json @@ -0,0 +1,95 @@ +{ + "name": "@opentelemetry/exporter-metrics-otlp-http", + "version": "0.26.0", + "description": "OpenTelemetry Collector Metrics Exporter allows user to send collected metrics to the OpenTelemetry Collector", + "main": "build/src/index.js", + "module": "build/esm/index.js", + "types": "build/src/index.d.ts", + "repository": "open-telemetry/opentelemetry-js", + "browser": { + "./src/platform/index.ts": "./src/platform/browser/index.ts", + "./build/esm/platform/index.js": "./build/esm/platform/browser/index.js", + "./build/src/platform/index.js": "./build/src/platform/browser/index.js" + }, + "scripts": { + "compile": "tsc --build tsconfig.json tsconfig.esm.json", + "clean": "tsc --build --clean tsconfig.json tsconfig.esm.json", + "codecov:browser": "nyc report --reporter=json && codecov -f coverage/*.json -p ../../", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "tdd": "npm run test -- --watch-extensions ts --watch", + "tdd:browser": "karma start", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts' --exclude 'test/browser/**/*.ts'", + "test:browser": "nyc karma start --single-run", + "version": "node ../../../scripts/version-update.js", + "watch": "tsc --build --watch tsconfig.json tsconfig.esm.json", + "precompile": "lerna run version --scope $(npm pkg get name) --include-filtered-dependencies", + "prewatch": "npm run precompile" + }, + "keywords": [ + "opentelemetry", + "nodejs", + "browser", + "tracing", + "profiling", + "metrics", + "stats" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + }, + "files": [ + "build/esm/**/*.js", + "build/esm/**/*.js.map", + "build/esm/**/*.d.ts", + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "doc", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@opentelemetry/api": "^1.0.3", + "@babel/core": "7.15.0", + "@types/mocha": "8.2.3", + "@types/node": "14.17.11", + "@types/sinon": "10.0.2", + "@types/webpack-env": "1.16.2", + "babel-loader": "8.2.2", + "codecov": "3.8.3", + "cpx": "1.5.0", + "istanbul-instrumenter-loader": "3.0.1", + "karma": "5.2.3", + "karma-chrome-launcher": "3.1.0", + "karma-coverage-istanbul-reporter": "3.0.3", + "karma-mocha": "2.0.1", + "karma-spec-reporter": "0.0.32", + "karma-webpack": "4.0.2", + "mocha": "7.2.0", + "nyc": "15.1.0", + "rimraf": "3.0.2", + "sinon": "11.1.2", + "ts-loader": "8.3.0", + "ts-mocha": "8.0.0", + "typescript": "4.3.5", + "webpack": "4.46.0", + "webpack-cli": "4.8.0", + "webpack-merge": "5.8.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.3" + }, + "dependencies": { + "@opentelemetry/api-metrics": "0.26.0", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/exporter-trace-otlp-http": "0.26.0", + "@opentelemetry/resources": "1.0.0", + "@opentelemetry/sdk-metrics-base": "0.26.0" + } +} diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/index.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/index.ts new file mode 100644 index 0000000000..f4e0549034 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './platform'; +export { toOTLPExportMetricServiceRequest } from './transformMetrics'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/browser/OTLPMetricExporter.ts similarity index 86% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/browser/OTLPMetricExporter.ts index 7d3840f4c3..b19eb0070b 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/browser/OTLPMetricExporter.ts @@ -15,12 +15,9 @@ */ import { MetricRecord, MetricExporter } from '@opentelemetry/sdk-metrics-base'; -import { OTLPExporterConfigBase } from '../../types'; -import * as otlpTypes from '../../types'; -import { OTLPExporterBrowserBase } from './OTLPExporterBrowserBase'; +import { OTLPExporterBrowserBase, otlpTypes, appendResourcePathToUrlIfNotPresent } from '@opentelemetry/exporter-trace-otlp-http'; import { toOTLPExportMetricServiceRequest } from '../../transformMetrics'; import { getEnv, baggageUtils } from '@opentelemetry/core'; -import { appendResourcePathToUrlIfNotPresent } from '../../util'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/metrics'; const DEFAULT_COLLECTOR_URL=`http://localhost:55681${DEFAULT_COLLECTOR_RESOURCE_PATH}`; @@ -37,7 +34,7 @@ export class OTLPMetricExporter // Converts time to nanoseconds private readonly _startTime = new Date().getTime() * 1000000; - constructor(config: OTLPExporterConfigBase = {}) { + constructor(config: otlpTypes.OTLPExporterConfigBase = {}) { super(config); this._headers = Object.assign( this._headers, @@ -57,7 +54,7 @@ export class OTLPMetricExporter ); } - getDefaultUrl(config: OTLPExporterConfigBase): string { + getDefaultUrl(config: otlpTypes.OTLPExporterConfigBase): string { return typeof config.url === 'string' ? config.url : getEnv().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length > 0 diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/src/index.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/browser/index.ts similarity index 94% rename from experimental/packages/opentelemetry-exporter-otlp-proto/src/index.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/browser/index.ts index d54490a7ea..7b73804ce4 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/src/index.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/browser/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './OTLPTraceExporter'; export * from './OTLPMetricExporter'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/index.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/index.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/index.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/index.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts similarity index 90% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts index 5d3b645591..05bf6af767 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/OTLPMetricExporter.ts @@ -15,12 +15,14 @@ */ import { MetricRecord, MetricExporter } from '@opentelemetry/sdk-metrics-base'; -import * as otlpTypes from '../../types'; -import { OTLPExporterNodeConfigBase } from './types'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; +import { + OTLPExporterNodeBase, + OTLPExporterNodeConfigBase, + otlpTypes, + appendResourcePathToUrlIfNotPresent +} from '@opentelemetry/exporter-trace-otlp-http'; import { toOTLPExportMetricServiceRequest } from '../../transformMetrics'; import { getEnv, baggageUtils } from '@opentelemetry/core'; -import { appendResourcePathToUrlIfNotPresent } from '../../util'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/metrics'; const DEFAULT_COLLECTOR_URL=`http://localhost:55681${DEFAULT_COLLECTOR_RESOURCE_PATH}`; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/index.ts similarity index 94% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/index.ts index d54490a7ea..7b73804ce4 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/index.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/platform/node/index.ts @@ -14,5 +14,4 @@ * limitations under the License. */ -export * from './OTLPTraceExporter'; export * from './OTLPMetricExporter'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts similarity index 88% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts index 97a0e1ec3e..c7b9169563 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/src/transformMetrics.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/src/transformMetrics.ts @@ -24,9 +24,7 @@ import { MetricRecord, } from '@opentelemetry/sdk-metrics-base'; import { Resource } from '@opentelemetry/resources'; -import { OTLPExporterBase } from './OTLPExporterBase'; -import { toCollectorResource } from './transform'; -import { OTLPExporterConfigBase, opentelemetryProto } from './types'; +import { OTLPExporterBase, otlpTypes, toCollectorResource } from '@opentelemetry/exporter-trace-otlp-http'; /** * Converts labels @@ -34,7 +32,7 @@ import { OTLPExporterConfigBase, opentelemetryProto } from './types'; */ export function toCollectorLabels( labels: Labels -): opentelemetryProto.common.v1.StringKeyValue[] { +): otlpTypes.opentelemetryProto.common.v1.StringKeyValue[] { return Object.entries(labels).map(([key, value]) => { return { key, value: String(value) }; }); @@ -46,9 +44,9 @@ export function toCollectorLabels( */ export function toAggregationTemporality( metric: MetricRecord -): opentelemetryProto.metrics.v1.AggregationTemporality { +): otlpTypes.opentelemetryProto.metrics.v1.AggregationTemporality { if (metric.descriptor.metricKind === MetricKind.OBSERVABLE_GAUGE) { - return opentelemetryProto.metrics.v1.AggregationTemporality + return otlpTypes.opentelemetryProto.metrics.v1.AggregationTemporality .AGGREGATION_TEMPORALITY_UNSPECIFIED; } @@ -63,7 +61,7 @@ export function toAggregationTemporality( export function toDataPoint( metric: MetricRecord, startTime: number -): opentelemetryProto.metrics.v1.DataPoint { +): otlpTypes.opentelemetryProto.metrics.v1.DataPoint { return { labels: toCollectorLabels(metric.labels), value: metric.aggregator.toPoint().value as number, @@ -82,7 +80,7 @@ export function toDataPoint( export function toHistogramPoint( metric: MetricRecord, startTime: number -): opentelemetryProto.metrics.v1.HistogramDataPoint { +): otlpTypes.opentelemetryProto.metrics.v1.HistogramDataPoint { const { value, timestamp } = metric.aggregator.toPoint() as { value: Histogram; timestamp: HrTime; @@ -106,8 +104,8 @@ export function toHistogramPoint( export function toCollectorMetric( metric: MetricRecord, startTime: number -): opentelemetryProto.metrics.v1.Metric { - const metricCollector: opentelemetryProto.metrics.v1.Metric = { +): otlpTypes.opentelemetryProto.metrics.v1.Metric { + const metricCollector: otlpTypes.opentelemetryProto.metrics.v1.Metric = { name: metric.descriptor.name, description: metric.descriptor.description, unit: metric.descriptor.unit, @@ -161,16 +159,16 @@ export function toCollectorMetric( * @param collectorMetricExporterBase */ export function toOTLPExportMetricServiceRequest< - T extends OTLPExporterConfigBase + T extends otlpTypes.OTLPExporterConfigBase >( metrics: MetricRecord[], startTime: number, collectorExporterBase: OTLPExporterBase< T, MetricRecord, - opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest + otlpTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest > -): opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest { +): otlpTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest { const groupedMetrics: Map< Resource, Map @@ -224,7 +222,7 @@ function toCollectorInstrumentationLibraryMetrics( instrumentationLibrary: core.InstrumentationLibrary, metrics: MetricRecord[], startTime: number -): opentelemetryProto.metrics.v1.InstrumentationLibraryMetrics { +): otlpTypes.opentelemetryProto.metrics.v1.InstrumentationLibraryMetrics { return { metrics: metrics.map(metric => toCollectorMetric(metric, startTime)), instrumentationLibrary, @@ -243,7 +241,7 @@ function toCollectorResourceMetrics( >, baseAttributes: SpanAttributes, startTime: number -): opentelemetryProto.metrics.v1.ResourceMetrics[] { +): otlpTypes.opentelemetryProto.metrics.v1.ResourceMetrics[] { return Array.from(groupedMetrics, ([resource, libMetrics]) => { return { resource: toCollectorResource(resource, baseAttributes), diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/browser/CollectorMetricExporter.test.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/browser/CollectorMetricExporter.test.ts index a2d289a7fe..ed31149691 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/browser/CollectorMetricExporter.test.ts @@ -31,8 +31,7 @@ import { import * as assert from 'assert'; import * as sinon from 'sinon'; import { OTLPMetricExporter } from '../../src/platform/browser/index'; -import * as otlpTypes from '../../src/types'; -import { OTLPExporterConfigBase } from '../../src/types'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { ensureCounterIsCorrect, ensureExportMetricsServiceRequestIsSet, @@ -43,7 +42,7 @@ import { mockCounter, mockObservableGauge, mockHistogram, -} from '../helper'; +} from '../metricsHelper'; describe('OTLPMetricExporter - web', () => { let collectorExporter: OTLPMetricExporter; @@ -321,7 +320,7 @@ describe('OTLPMetricExporter - web', () => { foo: 'bar', bar: 'baz', }; - let collectorExporterConfig: OTLPExporterConfigBase; + let collectorExporterConfig: otlpTypes.OTLPExporterConfigBase; beforeEach(() => { collectorExporterConfig = { diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/index-webpack.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/browser/index-webpack.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/browser/index-webpack.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/browser/index-webpack.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts similarity index 95% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts index 7282f538c0..91b678d2a2 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/CollectorMetricExporter.test.ts @@ -24,12 +24,10 @@ import { } from '@opentelemetry/sdk-metrics-base'; import * as assert from 'assert'; import * as sinon from 'sinon'; -import { OTLPExporterBase } from '../../src/OTLPExporterBase'; -import * as otlpTypes from '../../src/types'; -import { OTLPExporterConfigBase } from '../../src/types'; -import { mockCounter, mockObservableGauge } from '../helper'; +import { OTLPExporterBase, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import { mockCounter, mockObservableGauge } from '../metricsHelper'; -type CollectorExporterConfig = OTLPExporterConfigBase; +type CollectorExporterConfig = otlpTypes.OTLPExporterConfigBase; class OTLPMetricExporter extends OTLPExporterBase< CollectorExporterConfig, MetricRecord, diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts index 71ce5ab274..b14e1b96d5 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transformMetrics.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/common/transformMetrics.test.ts @@ -48,7 +48,7 @@ import { mockHistogram, multiInstrumentationLibraryMetricsGet, multiResourceMetricsGet, -} from '../helper'; +} from '../metricsHelper'; describe('transformMetrics', () => { describe('toCollectorMetric', async () => { diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/helper.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/metricsHelper.ts similarity index 57% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/helper.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/metricsHelper.ts index 5befa3515f..830be337f0 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/helper.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/metricsHelper.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; import { Counter, ObservableResult, @@ -24,13 +23,11 @@ import { Histogram, ValueType, } from '@opentelemetry/api-metrics'; -import { hexToBase64, InstrumentationLibrary, VERSION } from '@opentelemetry/core'; +import { InstrumentationLibrary, VERSION } from '@opentelemetry/core'; import * as metrics from '@opentelemetry/sdk-metrics-base'; import { Resource } from '@opentelemetry/resources'; -import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; -import * as otlpTypes from '../src/types'; -import { opentelemetryProto } from '../src/types'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; const meterProvider = new metrics.MeterProvider({ interval: 30000, @@ -150,68 +147,6 @@ export function mockHistogram(): metrics.Metric & return metric; } -const traceIdHex = '1f1008dc8e270e85c40a0d7c3939b278'; -const spanIdHex = '5e107261f64fa53e'; -const parentIdHex = '78a8915098864388'; - -export const mockedReadableSpan: ReadableSpan = { - name: 'documentFetch', - kind: 0, - spanContext: ()=> { - return { - traceId: '1f1008dc8e270e85c40a0d7c3939b278', - spanId: '5e107261f64fa53e', - traceFlags: TraceFlags.SAMPLED, - } - }, - parentSpanId: '78a8915098864388', - startTime: [1574120165, 429803070], - endTime: [1574120165, 438688070], - ended: true, - status: { code: SpanStatusCode.OK }, - attributes: { component: 'document-load' }, - links: [ - { - context: { - traceId: '1f1008dc8e270e85c40a0d7c3939b278', - spanId: '78a8915098864388', - traceFlags: TraceFlags.SAMPLED, - }, - attributes: { component: 'document-load' }, - }, - ], - events: [ - { name: 'fetchStart', time: [1574120165, 429803070] }, - { - name: 'domainLookupStart', - time: [1574120165, 429803070], - }, - { name: 'domainLookupEnd', time: [1574120165, 429803070] }, - { - name: 'connectStart', - time: [1574120165, 429803070], - }, - { name: 'connectEnd', time: [1574120165, 429803070] }, - { - name: 'requestStart', - time: [1574120165, 435513070], - }, - { name: 'responseStart', time: [1574120165, 436923070] }, - { - name: 'responseEnd', - time: [1574120165, 438688070], - }, - ], - duration: [0, 8885000], - resource: Resource.default() - .merge(new Resource({ - service: 'ui', - version: 1, - cost: 112.12, - })), - instrumentationLibrary: { name: 'default', version: '0.0.1' }, -}; - export const mockedResources: Resource[] = [ new Resource({ name: 'resource 1' }), new Resource({ name: 'resource 2' }), @@ -228,90 +163,6 @@ export const mockedInstrumentationLibraries: InstrumentationLibrary[] = [ }, ]; -export const basicTrace: ReadableSpan[] = [ - { - name: 'span1', - kind: 0, - spanContext: () => { - return { - traceId: '1f1008dc8e270e85c40a0d7c3939b278', - spanId: '5e107261f64fa53e', - traceFlags: TraceFlags.SAMPLED, - }; - }, - parentSpanId: '78a8915098864388', - startTime: [1574120165, 429803070], - endTime: [1574120165, 438688070], - ended: true, - status: { code: SpanStatusCode.OK }, - attributes: {}, - links: [], - events: [], - duration: [0, 8885000], - resource: mockedResources[0], - instrumentationLibrary: mockedInstrumentationLibraries[0], - }, - { - name: 'span2', - kind: 0, - spanContext: () => { - return { - traceId: '1f1008dc8e270e85c40a0d7c3939b278', - spanId: 'f64fa53e5e107261', - traceFlags: TraceFlags.SAMPLED, - }; - }, - parentSpanId: '78a8915098864388', - startTime: [1575120165, 439803070], - endTime: [1575120165, 448688070], - ended: true, - status: { code: SpanStatusCode.OK }, - attributes: {}, - links: [], - events: [], - duration: [0, 8775000], - resource: mockedResources[0], - instrumentationLibrary: mockedInstrumentationLibraries[0], - }, - { - name: 'span3', - kind: 0, - spanContext: () => { - return { - traceId: '1f1008dc8e270e85c40a0d7c3939b278', - spanId: '07261f64fa53e5e1', - traceFlags: TraceFlags.SAMPLED, - }; - }, - parentSpanId: 'a891578098864388', - startTime: [1575120165, 439803070], - endTime: [1575120165, 448688070], - ended: true, - status: { code: SpanStatusCode.OK }, - attributes: {}, - links: [], - events: [], - duration: [0, 8775000], - resource: mockedResources[0], - instrumentationLibrary: mockedInstrumentationLibraries[0], - }, -]; - -export const multiResourceTrace: ReadableSpan[] = [ - { - ...basicTrace[0], - resource: mockedResources[0], - }, - { - ...basicTrace[1], - resource: mockedResources[1], - }, - { - ...basicTrace[2], - resource: mockedResources[1], - }, -]; - export const multiResourceMetricsGet = function ( callback: (observableResult: ObservableResult) => unknown ): any[] { @@ -356,82 +207,8 @@ export const multiInstrumentationLibraryMetricsGet = function ( ]; }; -export const multiInstrumentationLibraryTrace: ReadableSpan[] = [ - { - ...basicTrace[0], - instrumentationLibrary: mockedInstrumentationLibraries[0], - }, - { - ...basicTrace[1], - instrumentationLibrary: mockedInstrumentationLibraries[0], - }, - { - ...basicTrace[2], - instrumentationLibrary: mockedInstrumentationLibraries[1], - }, -]; - -export function ensureEventsAreCorrect( - events: opentelemetryProto.trace.v1.Span.Event[] -) { - assert.deepStrictEqual( - events, - [ - { - timeUnixNano: 1574120165429803000, - name: 'fetchStart', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165429803000, - name: 'domainLookupStart', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165429803000, - name: 'domainLookupEnd', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165429803000, - name: 'connectStart', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165429803000, - name: 'connectEnd', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165435513000, - name: 'requestStart', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165436923100, - name: 'responseStart', - attributes: [], - droppedAttributesCount: 0, - }, - { - timeUnixNano: 1574120165438688000, - name: 'responseEnd', - attributes: [], - droppedAttributesCount: 0, - }, - ], - 'events are incorrect' - ); -} - export function ensureAttributesAreCorrect( - attributes: opentelemetryProto.common.v1.KeyValue[] + attributes: otlpTypes.opentelemetryProto.common.v1.KeyValue[] ) { assert.deepStrictEqual( attributes, @@ -447,89 +224,6 @@ export function ensureAttributesAreCorrect( ); } -export function ensureLinksAreCorrect( - attributes: opentelemetryProto.trace.v1.Span.Link[], - useHex?: boolean -) { - assert.deepStrictEqual( - attributes, - [ - { - traceId: useHex ? traceIdHex : hexToBase64(traceIdHex), - spanId: useHex ? parentIdHex : hexToBase64(parentIdHex), - attributes: [ - { - key: 'component', - value: { - stringValue: 'document-load', - }, - }, - ], - droppedAttributesCount: 0, - }, - ], - 'links are incorrect' - ); -} - -export function ensureSpanIsCorrect( - span: otlpTypes.opentelemetryProto.trace.v1.Span, - useHex = true -) { - if (span.attributes) { - ensureAttributesAreCorrect(span.attributes); - } - if (span.events) { - ensureEventsAreCorrect(span.events); - } - if (span.links) { - ensureLinksAreCorrect(span.links, useHex); - } - assert.deepStrictEqual( - span.traceId, - useHex ? traceIdHex : hexToBase64(traceIdHex), - 'traceId is' + ' wrong' - ); - assert.deepStrictEqual( - span.spanId, - useHex ? spanIdHex : hexToBase64(spanIdHex), - 'spanId is' + ' wrong' - ); - assert.deepStrictEqual( - span.parentSpanId, - useHex ? parentIdHex : hexToBase64(parentIdHex), - 'parentIdArr is wrong' - ); - assert.strictEqual(span.name, 'documentFetch', 'name is wrong'); - assert.strictEqual( - span.kind, - opentelemetryProto.trace.v1.Span.SpanKind.SPAN_KIND_INTERNAL, - 'kind is wrong' - ); - assert.strictEqual( - span.startTimeUnixNano, - 1574120165429803008, - 'startTimeUnixNano is wrong' - ); - assert.strictEqual( - span.endTimeUnixNano, - 1574120165438688000, - 'endTimeUnixNano is wrong' - ); - assert.strictEqual( - span.droppedAttributesCount, - 0, - 'droppedAttributesCount is wrong' - ); - assert.strictEqual(span.droppedEventsCount, 0, 'droppedEventsCount is wrong'); - assert.strictEqual(span.droppedLinksCount, 0, 'droppedLinksCount is wrong'); - assert.deepStrictEqual( - span.status, - { code: SpanStatusCode.OK }, - 'status is wrong' - ); -} - export function ensureWebResourceIsCorrect( resource: otlpTypes.opentelemetryProto.resource.v1.Resource ) { @@ -707,39 +401,6 @@ export function ensureHistogramIsCorrect( }); } -export function ensureExportTraceServiceRequestIsSet( - json: otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest -) { - const resourceSpans = json.resourceSpans; - assert.strictEqual( - resourceSpans && resourceSpans.length, - 1, - 'resourceSpans is missing' - ); - - const resource = resourceSpans[0].resource; - assert.strictEqual(!!resource, true, 'resource is missing'); - - const instrumentationLibrarySpans = - resourceSpans[0].instrumentationLibrarySpans; - assert.strictEqual( - instrumentationLibrarySpans && instrumentationLibrarySpans.length, - 1, - 'instrumentationLibrarySpans is missing' - ); - - const instrumentationLibrary = - instrumentationLibrarySpans[0].instrumentationLibrary; - assert.strictEqual( - !!instrumentationLibrary, - true, - 'instrumentationLibrary is missing' - ); - - const spans = instrumentationLibrarySpans[0].spans; - assert.strictEqual(spans && spans.length, 1, 'spans are missing'); -} - export function ensureExportMetricsServiceRequestIsSet( json: otlpTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest ) { diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts index 11308aeef2..f0beecd795 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/CollectorMetricExporter.test.ts @@ -32,10 +32,9 @@ import * as assert from 'assert'; import * as http from 'http'; import * as sinon from 'sinon'; import { - OTLPExporterNodeConfigBase, OTLPMetricExporter, } from '../../src/platform/node'; -import * as otlpTypes from '../../src/types'; +import { OTLPExporterNodeConfigBase, otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { ensureCounterIsCorrect, ensureExportMetricsServiceRequestIsSet, @@ -44,7 +43,7 @@ import { mockCounter, mockObservableGauge, mockHistogram, -} from '../helper'; +} from '../metricsHelper'; import { MockedResponse } from './nodeHelpers'; const fakeRequest = { diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/node/nodeHelpers.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/nodeHelpers.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/node/nodeHelpers.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-http/test/node/nodeHelpers.ts diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.esm.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.esm.json new file mode 100644 index 0000000000..379f547a46 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../tsconfig.base.esm.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "build/esm", + "tsBuildInfoFile": "build/esm/tsconfig.esm.tsbuildinfo" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json new file mode 100644 index 0000000000..ed9d0830bd --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-http/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ] +} diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/.eslintignore b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/.eslintignore similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/.eslintignore rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/.eslintignore diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/.eslintrc.js similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/.eslintrc.js rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/.eslintrc.js diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/.npmignore b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/.npmignore similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/.npmignore rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/.npmignore diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/LICENSE b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/LICENSE similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/LICENSE rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/LICENSE diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/README.md b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/README.md new file mode 100644 index 0000000000..efcfa521ca --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/README.md @@ -0,0 +1,71 @@ +# OpenTelemetry Collector Metrics Exporter for node with protobuf + +[![NPM Published Version][npm-img]][npm-url] +[![dependencies][dependencies-image]][dependencies-url] +[![devDependencies][devDependencies-image]][devDependencies-url] +[![Apache License][license-image]][license-image] + +This module provides exporter for node to be used with [opentelemetry-collector][opentelemetry-collector-url] - last tested with version **0.25.0**. + +## Installation + +```bash +npm install --save @opentelemetry/exporter-metrics-otlp-proto +``` + +## Service Name + +The OpenTelemetry Collector Exporter does not have a service name configuration. +In order to set the service name, use the `service.name` resource attribute as prescribed in the [OpenTelemetry Resource Semantic Conventions][semconv-resource-service-name]. +To see sample code and documentation for the traces exporter, visit the [Collector Trace Exporter for web and node][trace-exporter-url]. + +## Metrics in Node - PROTO over http + +```js +const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); +const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-proto'); +const collectorOptions = { + url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/metrics +}; +const exporter = new OTLPMetricExporter(collectorOptions); + +// Register the exporter +const meter = new MeterProvider({ + exporter, + interval: 60000, +}).getMeter('example-meter'); + +// Now, start recording data +const counter = meter.createCounter('metric_name'); +counter.add(10, { 'key': 'value' }); + +``` + +## Running opentelemetry-collector locally to see the metrics + +1. Go to examples/otlp-exporter-node +2. run `npm run docker:start` +3. Open page at `http://localhost:9411/zipkin/` to observe the metrics + +## Useful links + +- For more information on OpenTelemetry, visit: +- For more about OpenTelemetry JavaScript: +- For help or feedback on this project, join us in [GitHub Discussions][discussions-url] + +## License + +Apache 2.0 - See [LICENSE][license-url] for more information. + +[discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions +[license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE +[license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat +[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-proto +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-proto +[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-proto&type=dev +[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=experimental%2Fpackages%2Fopentelemetry-exporter-metrics-otlp-proto&type=dev +[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-metrics-otlp-proto +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-metrics-otlp-proto.svg +[opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector +[semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[trace-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-exporter-trace-otlp-http diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json new file mode 100644 index 0000000000..80465ea0ec --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/package.json @@ -0,0 +1,79 @@ +{ + "name": "@opentelemetry/exporter-metrics-otlp-proto", + "version": "0.26.0", + "description": "OpenTelemetry Collector Metrics Exporter allows user to send collected metrics to the OpenTelemetry Collector using protobuf over HTTP", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "open-telemetry/opentelemetry-js", + "scripts": { + "compile": "tsc --build", + "clean": "tsc --build --clean", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "postcompile": "npm run submodule && npm run protos:copy", + "protos:copy": "cpx protos/opentelemetry/**/*.* build/protos/opentelemetry", + "submodule": "git submodule sync --recursive && git submodule update --init --recursive", + "tdd": "npm run test -- --watch-extensions ts --watch", + "test": "nyc ts-mocha -p tsconfig.json 'test/**/*.test.ts'", + "version": "node ../../../scripts/version-update.js", + "watch": "npm run protos:copy && tsc -w", + "precompile": "lerna run version --scope $(npm pkg get name) --include-filtered-dependencies", + "prewatch": "npm run precompile" + }, + "keywords": [ + "opentelemetry", + "nodejs", + "protobuf", + "tracing", + "profiling", + "metrics", + "stats" + ], + "author": "OpenTelemetry Authors", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.js.map", + "build/src/**/*.d.ts", + "build/protos/**/*.proto", + "doc", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@opentelemetry/api": "^1.0.3", + "@babel/core": "7.15.0", + "@opentelemetry/api-metrics": "0.26.0", + "@types/mocha": "8.2.3", + "@types/node": "14.17.11", + "@types/sinon": "10.0.2", + "codecov": "3.8.3", + "cpx": "1.5.0", + "mocha": "7.2.0", + "nyc": "15.1.0", + "rimraf": "3.0.2", + "sinon": "11.1.2", + "ts-loader": "8.3.0", + "ts-mocha": "8.0.0", + "typescript": "4.3.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.3" + }, + "dependencies": { + "@grpc/proto-loader": "^0.6.4", + "@opentelemetry/core": "1.0.0", + "@opentelemetry/exporter-trace-otlp-http": "0.26.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.26.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.26.0", + "@opentelemetry/sdk-metrics-base": "0.26.0", + "@opentelemetry/resources": "1.0.0", + "protobufjs": "^6.9.0" + } +} diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/protos b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/protos rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/protos diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts similarity index 90% rename from experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts index bd1bc75c17..9bbbfa6c66 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPMetricExporter.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/OTLPMetricExporter.ts @@ -16,13 +16,12 @@ import { otlpTypes, - toOTLPExportMetricServiceRequest, OTLPExporterNodeConfigBase, appendResourcePathToUrlIfNotPresent, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; +import { toOTLPExportMetricServiceRequest } from '@opentelemetry/exporter-metrics-otlp-http'; import { MetricRecord, MetricExporter } from '@opentelemetry/sdk-metrics-base'; -import { ServiceClientType } from './types'; -import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; +import { ServiceClientType, OTLPExporterNodeBase } from '@opentelemetry/exporter-trace-otlp-proto'; import { getEnv, baggageUtils } from '@opentelemetry/core'; const DEFAULT_COLLECTOR_RESOURCE_PATH = '/v1/metrics'; diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/index.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/index.ts new file mode 100644 index 0000000000..7b73804ce4 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './OTLPMetricExporter'; diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/submodule.md b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/submodule.md new file mode 100644 index 0000000000..bbbca131ad --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/submodule.md @@ -0,0 +1,45 @@ +# Important + +**Submodule is always pointing to certain revision number. So updating the submodule repo will not have impact on your code. +Knowing this if you want to change the submodule to point to a different version (when for example proto has changed) here is how to do it:** + +## Updating submodule to point to certain revision number + +1. Make sure you are in the same folder as this instruction + +2. Update your submodules by running this command + + ```shell script + git submodule sync --recursive + git submodule update --init --recursive + ``` + +3. Find the SHA which you want to update to and copy it (the long one) + +4. Enter a submodule directory from this directory + + ```shell script + cd protos + ``` + +5. Updates files in the submodule tree to given commit: + + ```shell script + git checkout -q + ``` + +6. Return to the main directory: + + ```shell script + cd ../ + ``` + +7. Please run `git status` you should see something like `Head detached at`. This is correct, go to next step + +8. Now thing which is very important. You have to commit this to apply these changes + + ```shell script + git commit -am "chore: updating submodule for opentelemetry-proto" + ``` + +9. If you look now at git log you will notice that the folder `protos` has been changed and it will show what was the previous sha and what is current one. diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts rename to experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts index b623d2d819..831b66780e 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPMetricExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/OTLPMetricExporter.test.ts @@ -24,13 +24,14 @@ import { ExportResultCode } from '@opentelemetry/core'; import { OTLPExporterNodeConfigBase, otlpTypes, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; +import { getExportRequestProto } from '@opentelemetry/exporter-trace-otlp-proto'; import * as metrics from '@opentelemetry/sdk-metrics-base'; import * as assert from 'assert'; import * as http from 'http'; import * as sinon from 'sinon'; import { OTLPMetricExporter } from '../src'; -import { getExportRequestProto } from '../src/util'; + import { ensureExportedCounterIsCorrect, ensureExportedObservableGaugeIsCorrect, @@ -40,7 +41,7 @@ import { MockedResponse, mockObservableGauge, mockHistogram, -} from './helper'; +} from './metricsHelper'; const fakeRequest = { end: function () {}, diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts new file mode 100644 index 0000000000..b400f76a33 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/test/metricsHelper.ts @@ -0,0 +1,223 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + Counter, + ObservableResult, + ObservableGauge, + Histogram, + ValueType, +} from '@opentelemetry/api-metrics'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; +import * as metrics from '@opentelemetry/sdk-metrics-base'; +import { Resource } from '@opentelemetry/resources'; +import * as assert from 'assert'; +import { Stream } from 'stream'; + +const meterProvider = new metrics.MeterProvider({ + interval: 30000, + resource: new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + }), +}); + +const meter = meterProvider.getMeter('default', '0.0.1'); + +export function mockCounter(): metrics.Metric & Counter { + const name = 'int-counter'; + const metric = + meter['_metrics'].get(name) || + meter.createCounter(name, { + description: 'sample counter description', + valueType: ValueType.INT, + }); + metric.clear(); + metric.bind({}); + return metric; +} + +export function mockObservableGauge( + callback: (observableResult: ObservableResult) => void +): metrics.Metric & ObservableGauge { + const name = 'double-observable-gauge'; + const metric = + meter['_metrics'].get(name) || + meter.createObservableGauge( + name, + { + description: 'sample observable gauge description', + valueType: ValueType.DOUBLE, + }, + callback + ); + metric.clear(); + metric.bind({}); + return metric; +} + +export function mockHistogram(): metrics.Metric & + Histogram { + const name = 'int-histogram'; + const metric = + meter['_metrics'].get(name) || + meter.createHistogram(name, { + description: 'sample histogram description', + valueType: ValueType.INT, + boundaries: [0, 100], + }); + metric.clear(); + metric.bind({}); + return metric; +} + +export function ensureProtoAttributesAreCorrect( + attributes: otlpTypes.opentelemetryProto.common.v1.KeyValue[] +) { + assert.deepStrictEqual( + attributes, + [ + { + key: 'component', + value: { + stringValue: 'document-load', + }, + }, + ], + 'attributes are incorrect' + ); +} + +export function ensureExportedCounterIsCorrect( + metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, + time?: number +) { + assert.deepStrictEqual(metric, { + name: 'int-counter', + description: 'sample counter description', + unit: '1', + intSum: { + dataPoints: [ + { + value: '1', + startTimeUnixNano: '1592602232694000128', + timeUnixNano: String(time), + }, + ], + isMonotonic: true, + aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', + }, + }); +} + +export function ensureExportedObservableGaugeIsCorrect( + metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, + time?: number +) { + assert.deepStrictEqual(metric, { + name: 'double-observable-gauge', + description: 'sample observable gauge description', + unit: '1', + doubleGauge: { + dataPoints: [ + { + value: 6, + startTimeUnixNano: '1592602232694000128', + timeUnixNano: String(time), + }, + ], + }, + }); +} + +export function ensureExportedHistogramIsCorrect( + metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, + time?: number, + explicitBounds: number[] = [Infinity], + bucketCounts: string[] = ['2', '0'] +) { + assert.deepStrictEqual(metric, { + name: 'int-histogram', + description: 'sample histogram description', + unit: '1', + intHistogram: { + dataPoints: [ + { + sum: '21', + count: '2', + startTimeUnixNano: '1592602232694000128', + timeUnixNano: time, + bucketCounts, + explicitBounds, + }, + ], + aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', + }, + }); +} + +export function ensureExportMetricsServiceRequestIsSet( + json: otlpTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest +) { + const resourceMetrics = json.resourceMetrics; + assert.strictEqual( + resourceMetrics.length, + 1, + 'resourceMetrics has incorrect length' + ); + + const resource = resourceMetrics[0].resource; + assert.strictEqual(!!resource, true, 'resource is missing'); + + const instrumentationLibraryMetrics = + resourceMetrics[0].instrumentationLibraryMetrics; + assert.strictEqual( + instrumentationLibraryMetrics && instrumentationLibraryMetrics.length, + 1, + 'instrumentationLibraryMetrics is missing' + ); + + const instrumentationLibrary = + instrumentationLibraryMetrics[0].instrumentationLibrary; + assert.strictEqual( + !!instrumentationLibrary, + true, + 'instrumentationLibrary is missing' + ); + + const metrics = resourceMetrics[0].instrumentationLibraryMetrics[0].metrics; + assert.strictEqual(metrics.length, 3, 'Metrics are missing'); +} + +export class MockedResponse extends Stream { + constructor(private _code: number, private _msg?: string) { + super(); + } + + send(data: string) { + this.emit('data', data); + this.emit('end'); + } + + get statusCode() { + return this._code; + } + + get statusMessage() { + return this._msg; + } +} diff --git a/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json new file mode 100644 index 0000000000..03a463d637 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-metrics-otlp-proto/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build" + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "references": [ + { + "path": "../opentelemetry-sdk-metrics-base" + }, + { + "path": "../opentelemetry-exporter-metrics-otlp-http" + } + ] +} diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.eslintignore b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.eslintignore @@ -0,0 +1 @@ +build diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.eslintrc.js b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.eslintrc.js new file mode 100644 index 0000000000..3ed0fbeba3 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + }, + ...require('../../../eslint.config.js') +} diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.npmignore b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/LICENSE b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/README.md b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md similarity index 81% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/README.md rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md index 1ef2a34732..a6b1042930 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/README.md +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/README.md @@ -10,13 +10,14 @@ This module provides exporter for web and node to be used with [opentelemetry-co ## Installation ```bash -npm install --save @opentelemetry/exporter-otlp-grpc +npm install --save @opentelemetry/exporter-trace-otlp-grpc ``` ## Service Name The OpenTelemetry Collector Exporter does not have a service name configuration. In order to set the service name, use the `service.name` resource attribute as prescribed in the [OpenTelemetry Resource Semantic Conventions][semconv-resource-service-name]. +To see documentation and sample code for the metric exporter, see the [exporter-metrics-otlp-grpc package][metrics-exporter-url] ## Traces in Node - GRPC @@ -24,7 +25,7 @@ The OTLPTraceExporter in Node expects the URL to only be the hostname. It will n ```js const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base'); -const { OTLPTraceExporter } = require('@opentelemetry/exporter-otlp-grpc'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); const collectorOptions = { // url is optional and can be omitted - default is grpc://localhost:4317 @@ -48,7 +49,7 @@ const fs = require('fs'); const grpc = require('@grpc/grpc-js'); const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base'); -const { OTLPTraceExporter } = require('@opentelemetry/exporter-otlp-grpc'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); const collectorOptions = { // url is optional and can be omitted - default is grpc://localhost:4317 @@ -84,7 +85,7 @@ The exporter can be configured to send custom metadata with each request as in t const grpc = require('@grpc/grpc-js'); const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base'); -const { OTLPTraceExporter } = require('@opentelemetry/exporter-otlp-grpc'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc'); const metadata = new grpc.Metadata(); // For instance, an API key or access token might go here. @@ -108,34 +109,6 @@ provider.register(); Note, that this will only work if TLS is also configured on the server. -## Metrics in Node - GRPC - -The OTLPTraceExporter in Node expects the URL to only be the hostname. It will not work with `/v1/metrics`. All options that work with trace also work with metrics. - -```js -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); -const { OTLPMetricExporter } = require('@opentelemetry/exporter-otlp-grpc'); -const collectorOptions = { - // url is optional and can be omitted - default is grpc://localhost:4317 - url: 'grpc://:', -}; -const exporter = new OTLPMetricExporter(collectorOptions); - -// Register the exporter -const provider = new MeterProvider({ - exporter, - interval: 60000, -}) -['SIGINT', 'SIGTERM'].forEach(signal => { - process.on(signal, () => provider.shutdown().catch(console.error)); -}); - -// Now, start recording data -const meter = provider.getMeter('example-meter'); -const counter = meter.createCounter('metric_name'); -counter.add(10, { 'key': 'value' }); -``` - ## Running opentelemetry-collector locally to see the traces 1. Go to examples/otlp-exporter-node @@ -155,11 +128,12 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions [license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE [license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat -[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-otlp-grpc -[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-otlp-grpc -[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-otlp-grpc&type=dev -[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-otlp-grpc&type=dev -[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-otlp-grpc -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-collector-grpc.svg +[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-grpc +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-grpc +[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-grpc&type=dev +[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-grpc&type=dev +[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-grpc +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-otlp-grpc.svg [opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector [semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-metrics-otlp-grpc diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json similarity index 91% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/package.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json index 8c7729b255..e583a02f45 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/package.json @@ -1,5 +1,5 @@ { - "name": "@opentelemetry/exporter-otlp-grpc", + "name": "@opentelemetry/exporter-trace-otlp-grpc", "version": "0.26.0", "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector", "main": "build/src/index.js", @@ -49,7 +49,6 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.3", - "@opentelemetry/api-metrics": "0.26.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -70,9 +69,8 @@ "@grpc/grpc-js": "^1.3.7", "@grpc/proto-loader": "^0.6.4", "@opentelemetry/core": "1.0.0", - "@opentelemetry/exporter-otlp-http": "0.26.0", + "@opentelemetry/exporter-trace-otlp-http": "0.26.0", "@opentelemetry/resources": "1.0.0", - "@opentelemetry/sdk-metrics-base": "0.26.0", "@opentelemetry/sdk-trace-base": "1.0.0" } } diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/protos b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/protos new file mode 160000 index 0000000000..59c488bfb8 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/protos @@ -0,0 +1 @@ +Subproject commit 59c488bfb8fb6d0458ad6425758b70259ff4a2bd diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/OTLPExporterNodeBase.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/OTLPExporterNodeBase.ts index 895ee3fa28..0c516865bd 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPExporterNodeBase.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/OTLPExporterNodeBase.ts @@ -18,7 +18,7 @@ import { diag } from '@opentelemetry/api'; import { OTLPExporterBase, otlpTypes, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; import { Metadata } from '@grpc/grpc-js'; import { OTLPExporterConfigNode, diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts similarity index 97% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts index 828a7067d7..252a752a6d 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/OTLPTraceExporter.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/OTLPTraceExporter.ts @@ -19,7 +19,7 @@ import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; import { otlpTypes, toOTLPExportTraceServiceRequest, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; import { OTLPExporterConfigNode, ServiceClientType } from './types'; import { baggageUtils, getEnv } from '@opentelemetry/core'; import { validateAndNormalizeUrl } from './util'; diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/index.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/index.ts new file mode 100644 index 0000000000..34975b3ed5 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './OTLPExporterNodeBase'; +export * from './OTLPTraceExporter'; +export { ServiceClientType, OTLPExporterConfigNode } from './types'; +export { validateAndNormalizeUrl } from './util'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/types.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/types.ts similarity index 95% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/src/types.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/types.ts index da10ea415d..e9513819e7 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/types.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import * as grpc from '@grpc/grpc-js'; /** diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/util.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/util.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/src/util.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/util.ts index 1e2e480383..e0021ce896 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/src/util.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/src/util.ts @@ -18,7 +18,7 @@ import * as grpc from '@grpc/grpc-js'; import * as protoLoader from '@grpc/proto-loader'; import { diag } from '@opentelemetry/api'; import { globalErrorHandler } from '@opentelemetry/core'; -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import * as path from 'path'; import { OTLPExporterNodeBase } from './OTLPExporterNodeBase'; import { URL } from 'url'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/submodule.md b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/submodule.md similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/submodule.md rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/submodule.md diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/OTLPExporterNodeBase.test.ts similarity index 97% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/OTLPExporterNodeBase.test.ts index f52f212f37..dbe6c6b406 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPExporterNodeBase.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/OTLPExporterNodeBase.test.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import { OTLPExporterNodeBase } from '../src/OTLPExporterNodeBase'; import { OTLPExporterConfigNode, ServiceClientType } from '../src/types'; -import { mockedReadableSpan } from './helper'; +import { mockedReadableSpan } from './traceHelper'; class MockCollectorExporter extends OTLPExporterNodeBase< ReadableSpan, diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts index 2014308967..2d17bf9f78 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/OTLPTraceExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/OTLPTraceExporter.test.ts @@ -15,7 +15,7 @@ */ import * as protoLoader from '@grpc/proto-loader'; -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { diag } from '@opentelemetry/api'; import { BasicTracerProvider, @@ -34,7 +34,7 @@ import { ensureMetadataIsCorrect, ensureResourceIsCorrect, mockedReadableSpan, -} from './helper'; +} from './traceHelper'; const traceServiceProtoPath = 'opentelemetry/proto/collector/trace/v1/trace_service.proto'; diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/ca.crt new file mode 100644 index 0000000000..b6db7d0dd2 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/ca.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFozCCA4ugAwIBAgIUCdllngMpqYtsqRCpqdXxPZiSbGEwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQHDBFPcGVuVGVs +ZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9vdDENMAsGA1UECwwEVGVzdDELMAkGA1UE +AwwCY2EwHhcNMjEwNjA3MjAyNzMyWhcNMjIwNjA3MjAyNzMyWjBhMQswCQYDVQQG +EwJDTDELMAkGA1UECAwCUk0xGjAYBgNVBAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0w +CwYDVQQKDARSb290MQ0wCwYDVQQLDARUZXN0MQswCQYDVQQDDAJjYTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKS4d8790qpxSOMAMNSxlvFxZvxZKih5 +BjKDefa3sPL8iSOZ12mSZyWqPifjU+fnb3PDLWJPEFYQiwpyMctlXoXo5qiDm1D5 +mLZPTc7/qbiyu33YZHW+iE23GiOQBfvgKHTqh2+ejWs9h/txlWlQuKm0NEDPnA2P +kHiIjudSkWCT1w0WOnlJXd/9CWq6gW0nCTeOmwGYaY7T/i1W500qQyv5j1xHrJCu +m9amRzZEc1I4L2XF8Lnz2vDuEEs2W1vjcO++sXODlSC78dIyGnDWxGuK+V7dhccB +jj/Q5V96CMUoY7RGl18hwn/MSkzmWghsQFkfYWw1Xvez8/IWh7AlEtB/hDn2Dqw7 +lr6lvn1cOUmhHAgYV+v/0gWFN482qi3OaR0z2cCdmfSxRlxhtrq0jH7B3dW5YXcf +ke9e4gh7P980HWeHPwanBlV7BAsPxJY7N+je1LsjHVkwv2OnpkAzGQqJycOzPAzn +tib/lxmhBYVV4eWhCKvLrDqkgp5J3Cp99wIovW6TEfg2PJG4jZI9PKztPQb/OHZp +995oEAG8lmgcCA6kpvwVvle/m3wXj4eKQ1U0mQLGfJja2ripSBk7aAlr7qxWbvjv +4kxe5dJPMRmVB3PRZvnNilfM78Pbn+du0X8TiSwXeG5Og8uSvGwBzQNeW0EZ//b0 +fHNgQlyp4OL9AgMBAAGjUzBRMB0GA1UdDgQWBBSsdECnQyhXkgqyNWFlhkSGlUJd +MzAfBgNVHSMEGDAWgBSsdECnQyhXkgqyNWFlhkSGlUJdMzAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQAAfgD6lqyOyEOfGMAhtb5OVLpn5hG6WLfd +wyjIYzMNW5DScV9hrgB1ycfA9OIqBECWY3zP76X41KVI0siu7qg3bkaPM2qh7sbO +LXYCkDHNYF69Tlf0JR+Wpr740DIqoITcZRLy+/FMFWij9tNAsY1EcLrSYuiEd8/L +OanlD9AaA3fL1pOsfiNM7Ec6nUFl537+yNFGxU+Q9T7EMb/ypz/FwN3/zBbO0xdk +ZqPh/jDETKorBH87QnFRidmK5DiXRwh323+l+cWEEe79ssGzLBcLr+rzOvDH0qbo +fLBWkRbBtAcRGJAgM0F9dLG4/hQisELobNSCZ4aITHmr1J6MFiVxaaEvIXQ94zgj +xVtAv2Fp4lvpJWMjk/iKc8IR56VkvK6bui7BYEFc+DmtJLw0ryFZDD1wEzbQ5Gzl +W7JBC3vR8zQPo7kVl99BKAsNLhC+tCGdbLLOJROyFWHai/bkcRPHOLOMY1/lM/Wf +rlIcc46pSIOzlsxnlrDzoQihjtg3SrNBkPaRaJE12WFHYELHBX+65HRGlkaXnxaY +HOqPN6NiHVB0i5C4+l0M7JdOx2kEYVQiprm4kBiM3BNMdRpThn4Vt12TnEyq/Cyz +khz4FAMw/ytbEWMxFvEQJdOK1vjmPHAMDSFXiixeklVUD5Th/9so4kRTu97j8fq/ +T0JDHso8+A== +-----END CERTIFICATE----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/ca.key new file mode 100644 index 0000000000..3a12f603d4 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/ca.key @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,723F7ADBF5E86DF0 + +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.crt new file mode 100644 index 0000000000..cbd324625f --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQELBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjEwNjA3MjAyNzMzWhcN +MjIwNjA3MjAyNzMzWjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZD +bGllbnQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMBc1F9O8OcCu8xspnN1MNwccUZCx+lsh1F50T5D0INmxz3rXxin +TkM+QjFsJ09iF8MmgouI+yxmTayMlW733dUc/XQ9cV9GRwWVlF1RnoYp7mXVwMnz +o80s7CGWc+geliqeLUgzGIoq4bGTp1eEeB2KGJ/w8E2bTLs5a6B0pHhQuVXZ+Pq0 +E0Uzl2wPc+WwjeZyGRU4PbWzX6bN+R05Pfxq8PXhJ6Jnt0j8pNoF/XU6mOIYQyQb +THEKR8qB2SXo5+D1JOlRiofWtK4wsRH/wNm7j7tq75UezhOeqp6YU6MwGnea1loa +65K+DDG/rFyvxSlDS/53gjyKGSqYod8pevvytKjtUmw6xX5i5nFnf+wrKmMH6EDe +Hm63LReBv/CqCErYt4kV3NkdIuHmv7ZIdRfhDPdK8Q/kzAlRTX25wK/xWn5CqpSK +KCUwukEzccV266KU4sG63/4byv6zE62z8472P6u+OGSZlDxznL0BBg9iiHFYiopw +shBfFcszPCSOs1SO8XZH+6J5ypKBzBP7aAsyJflPHWGTUBACY9ZCU/7iwIF7YFPb +a/temVMLkg75oYGVow0Dlp55jQvrzMr7IaSBCxFUJEKf5u6GSNotJWmQdHYta5SH +Kj/rryFQV5qp9mBfia5DWnjHijFZTo+c/KLrgkmzfgbT4qVpnuxKahXNAgMBAAEw +DQYJKoZIhvcNAQELBQADggIBAA2nZTbaa9z/LTNJijf0clu4ULPG4RrqHgQ1q/Wh +NbrNemrxTJ+ZAwCR1gTv4oZe9NBd+V1pDXDQBid8mBTbttVrQCHdjgHFpQKNeyiK +nd2OI4awYiTvGbgDCMHAW/yf+XKCocuSkyNRnmfe8PihFD9wx6+kl6XCJuIkF3Vw +MGKEIrW2WLAARtBZeKV2yhtuVhkNm2TNFPfNrNtk2gdGO8TkX0orOllAENopR+GV +uffuLiIi9KWj9XP9T+6bdZbG2eMJX8wUNIIma54/3XN3RMi2iV9ZxW+F0j6d9ryo +j8pJJfpiW4qh6Eqi6HyvrzgdndKhkVYiIwbX5S60mqL+KcaPghX2goWexMW94QlQ +Re3/IvOAzGpu5fLn//y2tAaO9hDUsyoIJtXcFJKLbfM+mK/Bac2niEyBpr9Rzqur +N43Ga2pOsM4P/4YcAO6tvs5htvh2ala6UDXeEZV9Z1Bc5bOHAWNp13BfWE01iLNC +5rIu0XuVo1aa0FeVdJL6IpVeEwnkzDDt/9LKgp2K8w71VAtUSOg23AEYJu+GFr4D +y+0bahUiNETrFaiCsXQYa9HHFrqhA/PGOGpyq6GrBkJxWpzuL3rQQicpHzVIQEmb +3aCcIBdA2RQwQk7Z3YI2EuFMkHAElCXXZBulvxY6kl1n+2UwWRlocDMYZdkzI3+X +Tw8x +-----END CERTIFICATE----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.csr new file mode 100644 index 0000000000..e5de7b1912 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGQ2xp +ZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDAXNRfTvDnArvMbKZzdTDcHHFGQsfpbIdRedE+Q9CDZsc9618Yp05D +PkIxbCdPYhfDJoKLiPssZk2sjJVu993VHP10PXFfRkcFlZRdUZ6GKe5l1cDJ86PN +LOwhlnPoHpYqni1IMxiKKuGxk6dXhHgdihif8PBNm0y7OWugdKR4ULlV2fj6tBNF +M5dsD3PlsI3mchkVOD21s1+mzfkdOT38avD14SeiZ7dI/KTaBf11OpjiGEMkG0xx +CkfKgdkl6Ofg9STpUYqH1rSuMLER/8DZu4+7au+VHs4TnqqemFOjMBp3mtZaGuuS +vgwxv6xcr8UpQ0v+d4I8ihkqmKHfKXr78rSo7VJsOsV+YuZxZ3/sKypjB+hA3h5u +ty0Xgb/wqghK2LeJFdzZHSLh5r+2SHUX4Qz3SvEP5MwJUU19ucCv8Vp+QqqUiigl +MLpBM3HFduuilOLBut/+G8r+sxOts/OO9j+rvjhkmZQ8c5y9AQYPYohxWIqKcLIQ +XxXLMzwkjrNUjvF2R/uiecqSgcwT+2gLMiX5Tx1hk1AQAmPWQlP+4sCBe2BT22v7 +XplTC5IO+aGBlaMNA5aeeY0L68zK+yGkgQsRVCRCn+buhkjaLSVpkHR2LWuUhyo/ +668hUFeaqfZgX4muQ1p4x4oxWU6PnPyi64JJs34G0+KlaZ7sSmoVzQIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBAAtbvw2rrtnO5EeOF1Z+mJc9o3036liNbmCQTaC7 +Pf2yqo3Zk44L80R99sX5rDoq79MKEr//ED5C410EiCvzX42w330p7dasuoYRAwLw +YB0UwWnrKhm4SU20SC8zpnCUBL6K9lmXF2PJtkoMgFAnB8tIEc+DAr4hBIqh45vD +VgZ06GHH94/G6tIW3qNvi1mmvUYV0i6D3xBhcNAu6R/zopEYM3png24ZE2IlzZCX +x8hbYuMAqeQXSHQM9sKhXeb60GT8ns7d3P17S/TfpkTI7zRMkPhzsHC/Vp97xN/n +ojEEBY3MZJBPZj/q/buDfbp5x6H7/YxYdOKQKaGVWECGabISBcsg8NxaY++GKc+u +10C8O9KILRCJKGh8ze7chXx5n5+BPEoVVwhLn58eV7sOODvb4kZySUJHvFBb0ZM/ +7626K3443e5ZRkGXydvDIwPZgoiJ3L1L9+olL1cJ5rsRE6L5k6vPuJOeZITm4au2 +pE0THMHx/RjCMA1Lb/0BiDqbBHSh8hh+mHU7YXTq1Fxi2dSas0wAxcTBRs8TULsV +o57TmJqF+byiqwQvugyN7tndvWg9c+LDJHqitA5QC1GDXEi/bdjd7YeHRiL+ciVM +ZXXU9GT1O78O+84wbIDebahn8cifdGa7Kft7GftS3pCIyAjU9+eMXyT1JG3nssLr +4/ht +-----END CERTIFICATE REQUEST----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.key b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.key new file mode 100644 index 0000000000..9219944ca4 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/client.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/regenerate.sh new file mode 100755 index 0000000000..e1f1af5b54 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/regenerate.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh +# +# Usage: regenerate.sh +# +# regenerate.sh regenerates certificates that are used to test gRPC with TLS +# Make sure you run it in test/certs directory. +# It also serves as a documentation on how existing certificates were generated. + +rm ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key + +openssl genrsa -nodes -des3 -out ca.key 4096 +openssl req -nodes -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Root/OU=Test/CN=ca" + +openssl genrsa -nodes -des3 -out server.key 4096 +openssl req -nodes -new -key server.key -out server.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Server/CN=localhost" +openssl x509 -req -nodes -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt +openssl rsa -nodes -in server.key -out server.key + +openssl genrsa -nodes -des3 -out client.key 4096 +openssl req -nodes -new -key client.key -out client.csr -subj "/C=CL/ST=RM/L=OpenTelemetryTest/O=Test/OU=Client/CN=localhost" +openssl x509 -nodes -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt +openssl rsa -nodes -in client.key -out client.key diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.crt new file mode 100644 index 0000000000..09094e4526 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPzCCAycCAQEwDQYJKoZIhvcNAQELBQAwYTELMAkGA1UEBhMCQ0wxCzAJBgNV +BAgMAlJNMRowGAYDVQQHDBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEUm9v +dDENMAsGA1UECwwEVGVzdDELMAkGA1UEAwwCY2EwHhcNMjEwNjA3MjAyNzMyWhcN +MjIwNjA3MjAyNzMyWjBqMQswCQYDVQQGEwJDTDELMAkGA1UECAwCUk0xGjAYBgNV +BAcMEU9wZW5UZWxlbWV0cnlUZXN0MQ0wCwYDVQQKDARUZXN0MQ8wDQYDVQQLDAZT +ZXJ2ZXIxEjAQBgNVBAMMCWxvY2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANaRv7jpdEedG0CQ/LoJEXuE32eZXzar45u05wq5CzqnUlYdHyx8 +cgCJJ44KThFXiOzgELFiiwjxmPo1CDLqGp8vEDHntvhxLhw/mFy/aa7YrCv1/1eX +0+cEvNUyoikjHKXECI7sV1ZVMrimGKXQNqRfub1JbJ+IzL+kp6MRtdA6GzxsU0Dg +Wwf7IQxtCQ4Tw3onJ3P3NZAkgz6zCVhOVkR7DuqGulzTQDa//mWwKQJie5wscURj +vLsJ0prS16Tc/5yXijwRjwx8ZEoDrJ5KszoMQwKIoLN7wHBo2r8/8RQsOGTVMJ1I +9kOkH3s9clswxCrnpzdNNmyIwTWaQ6CqpQpp0unGimF3VokanHhOhcpkWfzDArmU +jL4PIFBQBJvHIEKbuhZ4pUYL/6RtgEg2f3xVPe8s0hn/DzwJTgXqEX+TY7WvIKmH +0sMGZ9TZzWe9W64LM2/427+6pfgQOAJDHNLSYpmaa14R+630IMocdY6sj2hoZ9TK +8Ridqn+q+5kIpG/pP7bbzbzsotdzjNb6h7GBlsuyycoOfiP+C6Zs/yUZAAZEsSm0 +e4dXFCccurkXRL7cZJHC/agQhkkvcEP1TpmaygjbucME+h6H0G0St8yzBQwEJdkn +wNmfEhIdjmiX6u/fvPO6VJ5HBxgA5gONJlk+4EbiZTfl2rYauBFhloHzAgMBAAEw +DQYJKoZIhvcNAQELBQADggIBACIJLqVoH8oh8W0/0IF3sxH8LFsGByi0CUPo1JEB +1t3+FqyC7eFC9rDW12LfOKgiZl273OBpCHT8bx3OkoGZ4KwZsbsznyJv/X5OVYFH +5y5Lo8QNGWWMzXoK2JLlYJXZHMaJr5tTFOGqoIvC9C8ibLSAbL0MhtB9L5SvSxAm +mUOKZ/en7ZBepRex/s/rfCWYYTw2Ah02HZc8+H/J/aF3tvChI7Gx0anaSQxS48Ru +3eCaiaBEfoSGQvN9Jc+k1QJgJ4vZ8yi7ndl8pwW97YXo8Sg305ritqpnon+vemsV +rYoqHN+WV2/D0nqNu1AX8PldDvUYTfBtLfS7T5goN7abEIJCaTNmzU2ji0SqI9vJ +j4t9E9KcCKMshbciDrD7RPEPk3vogEDD3uygFwcPwUQfpCUFbRJOnTSH1oB/aUC4 +x9DnYSHBdDvaBmu0pBpoddJ+0pbw02P7YL9kPz5OnOAN06JP4McIYz5ytKoSt/m8 +Z7cUnvn7TRVNLuiapwpB0gtRmb9JY1q3pd63+X0SCaBEtUH+PWcRcS7eDsgMwEym +0CyANhCQYJjcKugIWLYtN/0/p2bIKcRmcH3iJiN2zZtP1AF6G7a4mp+21OynvFOc +3+ojTDGJxxD3uPtKEhJXRgYMOmfAEn3rgtoln1kkNYcd7f2EIulckwB2yeM1IMud +0le7 +-----END CERTIFICATE----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.csr new file mode 100644 index 0000000000..bb61322340 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.csr @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIErzCCApcCAQAwajELMAkGA1UEBhMCQ0wxCzAJBgNVBAgMAlJNMRowGAYDVQQH +DBFPcGVuVGVsZW1ldHJ5VGVzdDENMAsGA1UECgwEVGVzdDEPMA0GA1UECwwGU2Vy +dmVyMRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDWkb+46XRHnRtAkPy6CRF7hN9nmV82q+ObtOcKuQs6p1JWHR8sfHIA +iSeOCk4RV4js4BCxYosI8Zj6NQgy6hqfLxAx57b4cS4cP5hcv2mu2Kwr9f9Xl9Pn +BLzVMqIpIxylxAiO7FdWVTK4phil0DakX7m9SWyfiMy/pKejEbXQOhs8bFNA4FsH ++yEMbQkOE8N6Jydz9zWQJIM+swlYTlZEew7qhrpc00A2v/5lsCkCYnucLHFEY7y7 +CdKa0tek3P+cl4o8EY8MfGRKA6yeSrM6DEMCiKCze8BwaNq/P/EULDhk1TCdSPZD +pB97PXJbMMQq56c3TTZsiME1mkOgqqUKadLpxophd1aJGpx4ToXKZFn8wwK5lIy+ +DyBQUASbxyBCm7oWeKVGC/+kbYBINn98VT3vLNIZ/w88CU4F6hF/k2O1ryCph9LD +BmfU2c1nvVuuCzNv+Nu/uqX4EDgCQxzS0mKZmmteEfut9CDKHHWOrI9oaGfUyvEY +nap/qvuZCKRv6T+228287KLXc4zW+oexgZbLssnKDn4j/gumbP8lGQAGRLEptHuH +VxQnHLq5F0S+3GSRwv2oEIZJL3BD9U6ZmsoI27nDBPoeh9BtErfMswUMBCXZJ8DZ +nxISHY5ol+rv37zzulSeRwcYAOYDjSZZPuBG4mU35dq2GrgRYZaB8wIDAQABoAAw +DQYJKoZIhvcNAQELBQADggIBALQRbWtd7VIT7PI0g2TJY2nyFDZ+iNLlsqtlTQ+3 +9tDUNf911AyXGFBH2OaIg49UEl3Dn3ErAH6nZluZhRNjZRUYfE2dSEVYoeAA3SmE +FElARM1CX4dQUDnV++RLLRIKKGfcnwU+vSEWN4QfXs9qjI2UK80CBr6kPEt+bMfR +wUIax5HT1XLECoLph1rNza0h3WNk5ndEJMAt51U0JNAi6PwDF04ZfnX5E2RtiEjV ++3DPW1HYlX2hepkXVJPB568bbpmWLrmJsHjVZy4vmDoQi2bzS/QPsepgQ3aXxNel +vTxh0Or5SdIRRfNnP/Ov/aYjBxzkcKY83ADh7h1aqMOlUyFenHoMfTWnMYkeNY+1 +dOoLUS/ZNA6IH54UO7uY0uOcwCfRPYZzDxZI0IkjogX0aizixSs5duQx0ux3sUOo +a4zxMNPd89ppbCMZDS7biC7cOAsdDYXKcE5ijpc5CQXVo4/dA2xyfisRT7WUq9ay +vmQoYfMCAkGv47BVYhzASyPIXuFP2/HDbtnBvZ2aeSuMAwhHzj3vX9js2HGy7t2V +kj36LymQv+YBp9mV9/crSqy0DNFAYOWOuig0mQX/SPedGa4jf9v4OhANi+kzgxtQ +hBTcA0OtJyrVxesVGGK0YwaQIIZ8jwhsK3ljlZpOfVUflHl2/etME1DXtU37U9xA +fuw0 +-----END CERTIFICATE REQUEST----- diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.key b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.key new file mode 100644 index 0000000000..ddac188c23 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/certs/server.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/traceHelper.ts similarity index 69% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/traceHelper.ts index 48325a12d4..83578d3c12 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/helper.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/traceHelper.ts @@ -15,32 +15,13 @@ */ import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; -import { - Counter, - ObservableResult, - ObservableGauge, - Histogram, - ValueType, -} from '@opentelemetry/api-metrics'; -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; -import * as metrics from '@opentelemetry/sdk-metrics-base'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import * as grpc from '@grpc/grpc-js'; import { VERSION } from '@opentelemetry/core'; -const meterProvider = new metrics.MeterProvider({ - interval: 30000, - resource: new Resource({ - service: 'ui', - version: 1, - cost: 112.12, - }), -}); - -const meter = meterProvider.getMeter('default', '0.0.1'); - const traceIdArr = [ 31, 16, @@ -62,53 +43,6 @@ const traceIdArr = [ const spanIdArr = [94, 16, 114, 97, 246, 79, 165, 62]; const parentIdArr = [120, 168, 145, 80, 152, 134, 67, 136]; -export function mockCounter(): metrics.Metric & Counter { - const name = 'int-counter'; - const metric = - meter['_metrics'].get(name) || - meter.createCounter(name, { - description: 'sample counter description', - valueType: ValueType.INT, - }); - metric.clear(); - metric.bind({}); - return metric; -} - -export function mockObservableGauge( - callback: (observableResult: ObservableResult) => void -): metrics.Metric & ObservableGauge { - const name = 'double-observable-gauge'; - const metric = - meter['_metrics'].get(name) || - meter.createObservableGauge( - name, - { - description: 'sample observable gauge description', - valueType: ValueType.DOUBLE, - }, - callback - ); - metric.clear(); - metric.bind({}); - return metric; -} - -export function mockHistogram(): metrics.Metric & - Histogram { - const name = 'int-histogram'; - const metric = - meter['_metrics'].get(name) || - meter.createHistogram(name, { - description: 'sample histogram description', - valueType: ValueType.INT, - boundaries: [0, 100], - }); - metric.clear(); - metric.bind({}); - return metric; -} - export const mockedReadableSpan: ReadableSpan = { name: 'documentFetch', kind: 0, @@ -327,83 +261,6 @@ export function ensureExportedSpanIsCorrect( ); } -export function ensureExportedCounterIsCorrect( - metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, - time?: number -) { - assert.deepStrictEqual(metric, { - name: 'int-counter', - description: 'sample counter description', - unit: '1', - data: 'intSum', - intSum: { - dataPoints: [ - { - labels: [], - exemplars: [], - value: '1', - startTimeUnixNano: '1592602232694000128', - timeUnixNano: String(time), - }, - ], - isMonotonic: true, - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); -} - -export function ensureExportedObservableGaugeIsCorrect( - metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, - time?: number -) { - assert.deepStrictEqual(metric, { - name: 'double-observable-gauge', - description: 'sample observable gauge description', - unit: '1', - data: 'doubleGauge', - doubleGauge: { - dataPoints: [ - { - labels: [], - exemplars: [], - value: 6, - startTimeUnixNano: '1592602232694000128', - timeUnixNano: String(time), - }, - ], - }, - }); -} - -export function ensureExportedHistogramIsCorrect( - metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, - time?: number, - explicitBounds: number[] = [Infinity], - bucketCounts: string[] = ['2', '0'] -) { - assert.deepStrictEqual(metric, { - name: 'int-histogram', - description: 'sample histogram description', - unit: '1', - data: 'intHistogram', - intHistogram: { - dataPoints: [ - { - labels: [], - exemplars: [], - sum: '21', - count: '2', - startTimeUnixNano: '1592602232694000128', - timeUnixNano: String(time), - bucketCounts, - explicitBounds, - }, - ], - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); -} - export function ensureResourceIsCorrect( resource: otlpTypes.opentelemetryProto.resource.v1.Resource ) { diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/test/util.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/util.test.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/test/util.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/test/util.test.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/tsconfig.json similarity index 85% rename from experimental/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-grpc/tsconfig.json index caced6b4e8..13dc2e7744 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-grpc/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-grpc/tsconfig.json @@ -13,7 +13,7 @@ "path": "../opentelemetry-api-metrics" }, { - "path": "../opentelemetry-exporter-otlp-http" + "path": "../opentelemetry-exporter-trace-otlp-http" }, { "path": "../opentelemetry-sdk-metrics-base" diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/.eslintignore b/experimental/packages/opentelemetry-exporter-trace-otlp-http/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/.eslintignore @@ -0,0 +1 @@ +build diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/.eslintrc.js b/experimental/packages/opentelemetry-exporter-trace-otlp-http/.eslintrc.js new file mode 100644 index 0000000000..e41d9a9299 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/.eslintrc.js @@ -0,0 +1,9 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + "browser": true + }, + ...require('../../../eslint.config.js') +} diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/.npmignore b/experimental/packages/opentelemetry-exporter-trace-otlp-http/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/LICENSE b/experimental/packages/opentelemetry-exporter-trace-otlp-http/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/README.md b/experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md similarity index 74% rename from experimental/packages/opentelemetry-exporter-otlp-http/README.md rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md index 7aff40f464..7614ea22de 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/README.md +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/README.md @@ -10,13 +10,14 @@ This module provides exporter for web and node to be used with [opentelemetry-co ## Installation ```bash -npm install --save @opentelemetry/exporter-otlp-http +npm install --save @opentelemetry/exporter-trace-otlp-http ``` ## Service Name The OpenTelemetry Collector Exporter does not have a service name configuration. In order to set the service name, use the `service.name` resource attribute as prescribed in the [OpenTelemetry Resource Semantic Conventions][semconv-resource-service-name]. +To see documentation and sample code for the metric exporter, see the [exporter-metrics-otlp-http package][metrics-exporter-url] ## Traces in Web @@ -25,7 +26,7 @@ The OTLPTraceExporter in Web expects the endpoint to end in `/v1/traces`. ```js import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'; import { WebTracerProvider } from '@opentelemetry/sdk-trace-web'; -import { OTLPTraceExporter } from '@opentelemetry/exporter-otlp-http'; +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; const collectorOptions = { url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/traces @@ -50,37 +51,11 @@ provider.register(); ``` -## Metrics in Web - -The OTLPMetricExporter in Web expects the endpoint to end in `/v1/metrics`. - -```js -import { MeterProvider } from '@opentelemetry/sdk-metrics-base'; -import { OTLPMetricExporter } from '@opentelemetry/exporter-otlp-http'; -const collectorOptions = { - url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/metrics - headers: {}, // an optional object containing custom headers to be sent with each request - concurrencyLimit: 1, // an optional limit on pending requests -}; -const exporter = new OTLPMetricExporter(collectorOptions); - -// Register the exporter -const meter = new MeterProvider({ - exporter, - interval: 60000, -}).getMeter('example-meter'); - -// Now, start recording data -const counter = meter.createCounter('metric_name'); -counter.add(10, { 'key': 'value' }); - -``` - ## Traces in Node - JSON over http ```js const { BasicTracerProvider, BatchSpanProcessor } = require('@opentelemetry/sdk-trace-base'); -const { OTLPTraceExporter } = require('@opentelemetry/exporter-otlp-http'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http'); const collectorOptions = { url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/traces @@ -103,29 +78,6 @@ provider.register(); ``` -## Metrics in Node - -```js -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); -const { OTLPMetricExporter } = require('@opentelemetry/exporter-otlp-http'); -const collectorOptions = { - url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/metrics - concurrencyLimit: 1, // an optional limit on pending requests -}; -const exporter = new OTLPMetricExporter(collectorOptions); - -// Register the exporter -const meter = new MeterProvider({ - exporter, - interval: 60000, -}).getMeter('example-meter'); - -// Now, start recording data -const counter = meter.createCounter('metric_name'); -counter.add(10, { 'key': 'value' }); - -``` - ## GRPC For GRPC please check [npm-url-grpc] @@ -175,14 +127,15 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions [license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE [license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat -[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-otlp-http -[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-otlp-http -[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-otlp-http&type=dev -[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-otlp-http&type=dev -[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-otlp-http -[npm-url-grpc]: https://www.npmjs.com/package/@opentelemetry/exporter-otlp-grpc -[npm-url-proto]: https://www.npmjs.com/package/@opentelemetry/exporter-otlp-proto -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-collector.svg +[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-http +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-http +[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-http&type=dev +[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-http&type=dev +[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-http +[npm-url-grpc]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-grpc +[npm-url-proto]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-proto +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-otlp-http.svg [opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector [opentelemetry-spec-protocol-exporter]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md#configuration-options [semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-metrics-otlp-http diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/karma.conf.js b/experimental/packages/opentelemetry-exporter-trace-otlp-http/karma.conf.js new file mode 100644 index 0000000000..4c60b54edb --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/karma.conf.js @@ -0,0 +1,26 @@ +/*! + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const karmaWebpackConfig = require('../../../karma.webpack'); +const karmaBaseConfig = require('../../../karma.base'); + +module.exports = (config) => { + config.set(Object.assign({}, karmaBaseConfig, { + webpack: karmaWebpackConfig, + files: ['test/browser/index-webpack.ts'], + preprocessors: { 'test/browser/index-webpack.ts': ['webpack'] } + })) +}; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json similarity index 91% rename from experimental/packages/opentelemetry-exporter-otlp-http/package.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json index ab16f94c4c..ce223c06e5 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/package.json @@ -1,7 +1,7 @@ { - "name": "@opentelemetry/exporter-otlp-http", + "name": "@opentelemetry/exporter-trace-otlp-http", "version": "0.26.0", - "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector", + "description": "OpenTelemetry Collector Trace Exporter allows user to send collected traces to the OpenTelemetry Collector", "main": "build/src/index.js", "module": "build/esm/index.js", "types": "build/src/index.d.ts", @@ -86,10 +86,8 @@ "@opentelemetry/api": "^1.0.0" }, "dependencies": { - "@opentelemetry/api-metrics": "0.26.0", "@opentelemetry/core": "1.0.0", "@opentelemetry/resources": "1.0.0", - "@opentelemetry/sdk-metrics-base": "0.26.0", "@opentelemetry/sdk-trace-base": "1.0.0" } } diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/OTLPExporterBase.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/OTLPExporterBase.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/OTLPExporterBase.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/OTLPExporterBase.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/index.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/index.ts similarity index 85% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/index.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/index.ts index 7b212c0399..bd025cd4d6 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/src/index.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/index.ts @@ -17,6 +17,5 @@ export * from './OTLPExporterBase'; export * from './platform'; export * as otlpTypes from './types'; -export { toOTLPExportTraceServiceRequest } from './transform'; -export { toOTLPExportMetricServiceRequest } from './transformMetrics'; +export { toCollectorResource, toOTLPExportTraceServiceRequest } from './transform'; export { appendResourcePathToUrlIfNotPresent } from './util'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/OTLPExporterBrowserBase.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/OTLPTraceExporter.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/OTLPTraceExporter.ts diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/index.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/index.ts new file mode 100644 index 0000000000..6a322e976a --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './OTLPTraceExporter'; +export * from './OTLPExporterBrowserBase'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/util.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/util.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/browser/util.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/browser/util.ts diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/index.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/index.ts new file mode 100644 index 0000000000..a33b81cffb --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './node'; +export { OTLPExporterBrowserBase } from './browser'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPExporterNodeBase.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/OTLPExporterNodeBase.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPExporterNodeBase.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/OTLPExporterNodeBase.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/OTLPTraceExporter.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/index.ts similarity index 95% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/index.ts index cfd5b2286d..ab18e724e0 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/index.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/index.ts @@ -15,7 +15,6 @@ */ export * from './OTLPTraceExporter'; -export * from './OTLPMetricExporter'; export * from './OTLPExporterNodeBase'; export * from './util'; export * from './types'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/types.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/types.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/types.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/types.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/util.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/util.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/platform/node/util.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/platform/node/util.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/transform.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/transform.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/transform.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/transform.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/types.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/types.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/types.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/types.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/src/util.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/src/util.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/src/util.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/src/util.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts index 33cc33fff8..0a709a953f 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/CollectorTraceExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/CollectorTraceExporter.test.ts @@ -29,7 +29,7 @@ import { ensureWebResourceIsCorrect, ensureHeadersContain, mockedReadableSpan, -} from '../helper'; +} from '../traceHelper'; describe('OTLPTraceExporter - web', () => { let collectorTraceExporter: OTLPTraceExporter; diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/index-webpack.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/index-webpack.ts new file mode 100644 index 0000000000..99100a0f6e --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/index-webpack.ts @@ -0,0 +1,23 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const testsContext = require.context('../browser', true, /test$/); +testsContext.keys().forEach(testsContext); + +const testsContextCommon = require.context('../common', true, /test$/); +testsContextCommon.keys().forEach(testsContextCommon); + +const srcContext = require.context('.', true, /src$/); +srcContext.keys().forEach(srcContext); diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/util.test.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/util.test.ts index ecb6c4c801..c4cb185da1 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/browser/util.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/browser/util.test.ts @@ -16,7 +16,7 @@ import * as sinon from 'sinon'; import { sendWithXhr } from '../../src/platform/browser/util'; -import { ensureHeadersContain } from '../helper'; +import { ensureHeadersContain } from '../traceHelper'; describe('util - browser', () => { let server: any; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/ca.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.crt rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/ca.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/ca.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/ca.key rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/ca.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/client.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.crt rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/client.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/client.csr similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.csr rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/client.csr diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.key b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/client.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/client.key rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/client.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/regenerate.sh similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/regenerate.sh rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/regenerate.sh diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/server.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.crt rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/server.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/server.csr similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.csr rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/server.csr diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.key b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/server.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/certs/server.key rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/certs/server.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/CollectorTraceExporter.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/CollectorTraceExporter.test.ts index f489a74906..945c059e5b 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/CollectorTraceExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/CollectorTraceExporter.test.ts @@ -20,7 +20,7 @@ import * as assert from 'assert'; import * as sinon from 'sinon'; import { OTLPExporterBase } from '../../src/OTLPExporterBase'; import { OTLPExporterConfigBase } from '../../src/types'; -import { mockedReadableSpan } from '../helper'; +import { mockedReadableSpan } from '../traceHelper'; import * as otlpTypes from '../../src/types'; type CollectorExporterConfig = OTLPExporterConfigBase; diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/transform.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/transform.test.ts index 0328aaea67..b2dfdf2145 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/transform.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/transform.test.ts @@ -25,7 +25,7 @@ import { mockedInstrumentationLibraries, multiResourceTrace, multiInstrumentationLibraryTrace, -} from '../helper'; +} from '../traceHelper'; import { Resource } from '@opentelemetry/resources'; describe('transform', () => { describe('toCollectorAttributes', () => { diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/common/utils.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/utils.test.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/common/utils.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/common/utils.test.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts index 8988572b67..33c9559dc9 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-http/test/node/CollectorTraceExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/node/CollectorTraceExporter.test.ts @@ -34,7 +34,7 @@ import { ensureExportTraceServiceRequestIsSet, ensureSpanIsCorrect, mockedReadableSpan, -} from '../helper'; +} from '../traceHelper'; let fakeRequest: PassThrough; diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/node/nodeHelpers.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/node/nodeHelpers.ts new file mode 100644 index 0000000000..1219f2d976 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/node/nodeHelpers.ts @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Stream } from 'stream'; + +export class MockedResponse extends Stream { + constructor(private _code: number, private _msg?: string) { + super(); + } + + send(data: string) { + this.emit('data', data); + this.emit('end'); + } + + get statusCode() { + return this._code; + } + + get statusMessage() { + return this._msg; + } +} diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/traceHelper.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/traceHelper.ts new file mode 100644 index 0000000000..9975f05f3c --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-http/test/traceHelper.ts @@ -0,0 +1,434 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; +import { hexToBase64, InstrumentationLibrary, VERSION } from '@opentelemetry/core'; +import { Resource } from '@opentelemetry/resources'; +import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; +import * as assert from 'assert'; +import * as otlpTypes from '../src/types'; +import { opentelemetryProto } from '../src/types'; + +if (typeof Buffer === 'undefined') { + (window as any).Buffer = { + from: function (arr: []) { + return new Uint8Array(arr); + }, + }; +} + +const traceIdHex = '1f1008dc8e270e85c40a0d7c3939b278'; +const spanIdHex = '5e107261f64fa53e'; +const parentIdHex = '78a8915098864388'; + +export const mockedReadableSpan: ReadableSpan = { + name: 'documentFetch', + kind: 0, + spanContext: ()=> { + return { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: '5e107261f64fa53e', + traceFlags: TraceFlags.SAMPLED, + } + }, + parentSpanId: '78a8915098864388', + startTime: [1574120165, 429803070], + endTime: [1574120165, 438688070], + ended: true, + status: { code: SpanStatusCode.OK }, + attributes: { component: 'document-load' }, + links: [ + { + context: { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: '78a8915098864388', + traceFlags: TraceFlags.SAMPLED, + }, + attributes: { component: 'document-load' }, + }, + ], + events: [ + { name: 'fetchStart', time: [1574120165, 429803070] }, + { + name: 'domainLookupStart', + time: [1574120165, 429803070], + }, + { name: 'domainLookupEnd', time: [1574120165, 429803070] }, + { + name: 'connectStart', + time: [1574120165, 429803070], + }, + { name: 'connectEnd', time: [1574120165, 429803070] }, + { + name: 'requestStart', + time: [1574120165, 435513070], + }, + { name: 'responseStart', time: [1574120165, 436923070] }, + { + name: 'responseEnd', + time: [1574120165, 438688070], + }, + ], + duration: [0, 8885000], + resource: Resource.default() + .merge(new Resource({ + service: 'ui', + version: 1, + cost: 112.12, + })), + instrumentationLibrary: { name: 'default', version: '0.0.1' }, +}; + +export const mockedResources: Resource[] = [ + new Resource({ name: 'resource 1' }), + new Resource({ name: 'resource 2' }), +]; + +export const mockedInstrumentationLibraries: InstrumentationLibrary[] = [ + { + name: 'lib1', + version: '0.0.1', + }, + { + name: 'lib2', + version: '0.0.2', + }, +]; + +export const basicTrace: ReadableSpan[] = [ + { + name: 'span1', + kind: 0, + spanContext: () => { + return { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: '5e107261f64fa53e', + traceFlags: TraceFlags.SAMPLED, + }; + }, + parentSpanId: '78a8915098864388', + startTime: [1574120165, 429803070], + endTime: [1574120165, 438688070], + ended: true, + status: { code: SpanStatusCode.OK }, + attributes: {}, + links: [], + events: [], + duration: [0, 8885000], + resource: mockedResources[0], + instrumentationLibrary: mockedInstrumentationLibraries[0], + }, + { + name: 'span2', + kind: 0, + spanContext: () => { + return { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: 'f64fa53e5e107261', + traceFlags: TraceFlags.SAMPLED, + }; + }, + parentSpanId: '78a8915098864388', + startTime: [1575120165, 439803070], + endTime: [1575120165, 448688070], + ended: true, + status: { code: SpanStatusCode.OK }, + attributes: {}, + links: [], + events: [], + duration: [0, 8775000], + resource: mockedResources[0], + instrumentationLibrary: mockedInstrumentationLibraries[0], + }, + { + name: 'span3', + kind: 0, + spanContext: () => { + return { + traceId: '1f1008dc8e270e85c40a0d7c3939b278', + spanId: '07261f64fa53e5e1', + traceFlags: TraceFlags.SAMPLED, + }; + }, + parentSpanId: 'a891578098864388', + startTime: [1575120165, 439803070], + endTime: [1575120165, 448688070], + ended: true, + status: { code: SpanStatusCode.OK }, + attributes: {}, + links: [], + events: [], + duration: [0, 8775000], + resource: mockedResources[0], + instrumentationLibrary: mockedInstrumentationLibraries[0], + }, +]; + +export const multiResourceTrace: ReadableSpan[] = [ + { + ...basicTrace[0], + resource: mockedResources[0], + }, + { + ...basicTrace[1], + resource: mockedResources[1], + }, + { + ...basicTrace[2], + resource: mockedResources[1], + }, +]; + +export const multiInstrumentationLibraryTrace: ReadableSpan[] = [ + { + ...basicTrace[0], + instrumentationLibrary: mockedInstrumentationLibraries[0], + }, + { + ...basicTrace[1], + instrumentationLibrary: mockedInstrumentationLibraries[0], + }, + { + ...basicTrace[2], + instrumentationLibrary: mockedInstrumentationLibraries[1], + }, +]; + +export function ensureEventsAreCorrect( + events: opentelemetryProto.trace.v1.Span.Event[] +) { + assert.deepStrictEqual( + events, + [ + { + timeUnixNano: 1574120165429803000, + name: 'fetchStart', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165429803000, + name: 'domainLookupStart', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165429803000, + name: 'domainLookupEnd', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165429803000, + name: 'connectStart', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165429803000, + name: 'connectEnd', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165435513000, + name: 'requestStart', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165436923100, + name: 'responseStart', + attributes: [], + droppedAttributesCount: 0, + }, + { + timeUnixNano: 1574120165438688000, + name: 'responseEnd', + attributes: [], + droppedAttributesCount: 0, + }, + ], + 'events are incorrect' + ); +} + +export function ensureAttributesAreCorrect( + attributes: opentelemetryProto.common.v1.KeyValue[] +) { + assert.deepStrictEqual( + attributes, + [ + { + key: 'component', + value: { + stringValue: 'document-load', + }, + }, + ], + 'attributes are incorrect' + ); +} + +export function ensureLinksAreCorrect( + attributes: opentelemetryProto.trace.v1.Span.Link[], + useHex?: boolean +) { + assert.deepStrictEqual( + attributes, + [ + { + traceId: useHex ? traceIdHex : hexToBase64(traceIdHex), + spanId: useHex ? parentIdHex : hexToBase64(parentIdHex), + attributes: [ + { + key: 'component', + value: { + stringValue: 'document-load', + }, + }, + ], + droppedAttributesCount: 0, + }, + ], + 'links are incorrect' + ); +} + +export function ensureSpanIsCorrect( + span: otlpTypes.opentelemetryProto.trace.v1.Span, + useHex = true +) { + if (span.attributes) { + ensureAttributesAreCorrect(span.attributes); + } + if (span.events) { + ensureEventsAreCorrect(span.events); + } + if (span.links) { + ensureLinksAreCorrect(span.links, useHex); + } + assert.deepStrictEqual( + span.traceId, + useHex ? traceIdHex : hexToBase64(traceIdHex), + 'traceId is' + ' wrong' + ); + assert.deepStrictEqual( + span.spanId, + useHex ? spanIdHex : hexToBase64(spanIdHex), + 'spanId is' + ' wrong' + ); + assert.deepStrictEqual( + span.parentSpanId, + useHex ? parentIdHex : hexToBase64(parentIdHex), + 'parentIdArr is wrong' + ); + assert.strictEqual(span.name, 'documentFetch', 'name is wrong'); + assert.strictEqual( + span.kind, + opentelemetryProto.trace.v1.Span.SpanKind.SPAN_KIND_INTERNAL, + 'kind is wrong' + ); + assert.strictEqual( + span.startTimeUnixNano, + 1574120165429803008, + 'startTimeUnixNano is wrong' + ); + assert.strictEqual( + span.endTimeUnixNano, + 1574120165438688000, + 'endTimeUnixNano is wrong' + ); + assert.strictEqual( + span.droppedAttributesCount, + 0, + 'droppedAttributesCount is wrong' + ); + assert.strictEqual(span.droppedEventsCount, 0, 'droppedEventsCount is wrong'); + assert.strictEqual(span.droppedLinksCount, 0, 'droppedLinksCount is wrong'); + assert.deepStrictEqual( + span.status, + { code: SpanStatusCode.OK }, + 'status is wrong' + ); +} + +export function ensureWebResourceIsCorrect( + resource: otlpTypes.opentelemetryProto.resource.v1.Resource +) { + assert.strictEqual(resource.attributes.length, 7); + assert.strictEqual(resource.attributes[0].key, 'service.name'); + assert.strictEqual(resource.attributes[0].value.stringValue, 'unknown_service'); + assert.strictEqual(resource.attributes[1].key, 'telemetry.sdk.language'); + assert.strictEqual(resource.attributes[1].value.stringValue, 'webjs'); + assert.strictEqual(resource.attributes[2].key, 'telemetry.sdk.name'); + assert.strictEqual(resource.attributes[2].value.stringValue, 'opentelemetry'); + assert.strictEqual(resource.attributes[3].key, 'telemetry.sdk.version'); + assert.strictEqual(resource.attributes[3].value.stringValue, VERSION); + assert.strictEqual(resource.attributes[4].key, 'service'); + assert.strictEqual(resource.attributes[4].value.stringValue, 'ui'); + assert.strictEqual(resource.attributes[5].key, 'version'); + assert.strictEqual(resource.attributes[5].value.intValue, 1); + assert.strictEqual(resource.attributes[6].key, 'cost'); + assert.strictEqual(resource.attributes[6].value.doubleValue, 112.12); + assert.strictEqual(resource.droppedAttributesCount, 0); +} + +export function ensureExportTraceServiceRequestIsSet( + json: otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest +) { + const resourceSpans = json.resourceSpans; + assert.strictEqual( + resourceSpans && resourceSpans.length, + 1, + 'resourceSpans is missing' + ); + + const resource = resourceSpans[0].resource; + assert.strictEqual(!!resource, true, 'resource is missing'); + + const instrumentationLibrarySpans = + resourceSpans[0].instrumentationLibrarySpans; + assert.strictEqual( + instrumentationLibrarySpans && instrumentationLibrarySpans.length, + 1, + 'instrumentationLibrarySpans is missing' + ); + + const instrumentationLibrary = + instrumentationLibrarySpans[0].instrumentationLibrary; + assert.strictEqual( + !!instrumentationLibrary, + true, + 'instrumentationLibrary is missing' + ); + + const spans = instrumentationLibrarySpans[0].spans; + assert.strictEqual(spans && spans.length, 1, 'spans are missing'); +} + +export function ensureHeadersContain( + actual: { [key: string]: string }, + expected: { [key: string]: string } +) { + Object.entries(expected).forEach(([k, v]) => { + assert.strictEqual( + v, + actual[k], + `Expected ${actual} to contain ${k}: ${v}` + ); + }); +} diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json b/experimental/packages/opentelemetry-exporter-trace-otlp-http/tsconfig.esm.json similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/tsconfig.esm.json diff --git a/experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.json b/experimental/packages/opentelemetry-exporter-trace-otlp-http/tsconfig.json similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-http/tsconfig.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-http/tsconfig.json diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.eslintignore b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.eslintignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.eslintignore @@ -0,0 +1 @@ +build diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.eslintrc.js b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.eslintrc.js new file mode 100644 index 0000000000..3ed0fbeba3 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + "env": { + "mocha": true, + "commonjs": true, + "node": true, + }, + ...require('../../../eslint.config.js') +} diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.npmignore b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.npmignore new file mode 100644 index 0000000000..9505ba9450 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/LICENSE b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/README.md b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md similarity index 76% rename from experimental/packages/opentelemetry-exporter-otlp-proto/README.md rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md index 55b14756ab..cb421a02ad 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/README.md +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/README.md @@ -10,19 +10,20 @@ This module provides exporter for node to be used with [opentelemetry-collector] ## Installation ```bash -npm install --save @opentelemetry/exporter-otlp-proto +npm install --save @opentelemetry/exporter-trace-otlp-proto ``` ## Service Name The OpenTelemetry Collector Exporter does not have a service name configuration. In order to set the service name, use the `service.name` resource attribute as prescribed in the [OpenTelemetry Resource Semantic Conventions][semconv-resource-service-name]. +To see documentation and sample code for the metric exporter, see the [exporter-metrics-otlp-proto package][metrics-exporter-url] ## Traces in Node - PROTO over http ```js const { BasicTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base'); -const { OTLPTraceExporter } = require('@opentelemetry/exporter-otlp-proto'); +const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto'); const collectorOptions = { url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/traces @@ -39,28 +40,6 @@ provider.register(); ``` -## Metrics in Node - PROTO over http - -```js -const { MeterProvider } = require('@opentelemetry/sdk-metrics-base'); -const { OTLPMetricExporter } = require('@opentelemetry/exporter-otlp-proto'); -const collectorOptions = { - url: '', // url is optional and can be omitted - default is http://localhost:55681/v1/metrics -}; -const exporter = new OTLPMetricExporter(collectorOptions); - -// Register the exporter -const meter = new MeterProvider({ - exporter, - interval: 60000, -}).getMeter('example-meter'); - -// Now, start recording data -const counter = meter.createCounter('metric_name'); -counter.add(10, { 'key': 'value' }); - -``` - ## Running opentelemetry-collector locally to see the traces 1. Go to examples/otlp-exporter-node @@ -80,11 +59,12 @@ Apache 2.0 - See [LICENSE][license-url] for more information. [discussions-url]: https://github.com/open-telemetry/opentelemetry-js/discussions [license-url]: https://github.com/open-telemetry/opentelemetry-js/blob/main/LICENSE [license-image]: https://img.shields.io/badge/license-Apache_2.0-green.svg?style=flat -[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-otlp-proto -[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-otlp-proto -[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-otlp-proto&type=dev -[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-otlp-proto&type=dev -[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-otlp-proto -[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-collector-proto.svg +[dependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-proto +[dependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-proto +[devDependencies-image]: https://status.david-dm.org/gh/open-telemetry/opentelemetry-js.svg?path=packages%2Fopentelemetry-exporter-trace-otlp-proto&type=dev +[devDependencies-url]: https://david-dm.org/open-telemetry/opentelemetry-js?path=packages%2Fopentelemetry-exporter-trace-otlp-proto&type=dev +[npm-url]: https://www.npmjs.com/package/@opentelemetry/exporter-trace-otlp-proto +[npm-img]: https://badge.fury.io/js/%40opentelemetry%2Fexporter-collector-otlp-proto.svg [opentelemetry-collector-url]: https://github.com/open-telemetry/opentelemetry-collector [semconv-resource-service-name]: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#service +[metrics-exporter-url]: https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/exporter-metrics-otlp-proto diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/package.json b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json similarity index 91% rename from experimental/packages/opentelemetry-exporter-otlp-proto/package.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json index 80eba49318..9d5e4c06f6 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/package.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/package.json @@ -1,5 +1,5 @@ { - "name": "@opentelemetry/exporter-otlp-proto", + "name": "@opentelemetry/exporter-trace-otlp-proto", "version": "0.26.0", "description": "OpenTelemetry Collector Exporter allows user to send collected traces to the OpenTelemetry Collector using protobuf over HTTP", "main": "build/src/index.js", @@ -49,7 +49,6 @@ "devDependencies": { "@babel/core": "7.15.0", "@opentelemetry/api": "^1.0.3", - "@opentelemetry/api-metrics": "0.26.0", "@types/mocha": "8.2.3", "@types/node": "14.17.11", "@types/sinon": "10.0.2", @@ -69,9 +68,8 @@ "dependencies": { "@grpc/proto-loader": "^0.6.4", "@opentelemetry/core": "1.0.0", - "@opentelemetry/exporter-otlp-http": "0.26.0", + "@opentelemetry/exporter-trace-otlp-http": "0.26.0", "@opentelemetry/resources": "1.0.0", - "@opentelemetry/sdk-metrics-base": "0.26.0", "@opentelemetry/sdk-trace-base": "1.0.0", "protobufjs": "^6.9.0" } diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/protos b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/protos new file mode 160000 index 0000000000..59c488bfb8 --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/protos @@ -0,0 +1 @@ +Subproject commit 59c488bfb8fb6d0458ad6425758b70259ff4a2bd diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/OTLPExporterNodeBase.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/OTLPExporterNodeBase.ts index 5cb553a5c0..bebc831650 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPExporterNodeBase.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/OTLPExporterNodeBase.ts @@ -20,7 +20,7 @@ import { otlpTypes, OTLPExporterNodeConfigBase, CompressionAlgorithm, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; import { ServiceClientType } from './types'; type SendFn = (collector: OTLPExporterNodeBase, diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/OTLPTraceExporter.ts similarity index 97% rename from experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/OTLPTraceExporter.ts index 1e2f8d7af4..b17e3c0633 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/src/OTLPTraceExporter.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/OTLPTraceExporter.ts @@ -21,7 +21,7 @@ import { toOTLPExportTraceServiceRequest, OTLPExporterNodeConfigBase, appendResourcePathToUrlIfNotPresent, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; import { ServiceClientType } from './types'; import { getEnv, baggageUtils } from '@opentelemetry/core'; diff --git a/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/index.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/index.ts new file mode 100644 index 0000000000..bf4ab432ce --- /dev/null +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './OTLPTraceExporter'; +export * from './OTLPExporterNodeBase'; +export * from './types'; +export * from './util'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/src/types.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/types.ts similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/src/types.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/types.ts diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/src/util.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/util.ts similarity index 98% rename from experimental/packages/opentelemetry-exporter-otlp-proto/src/util.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/util.ts index d019afde80..007b35b56e 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/src/util.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/src/util.ts @@ -19,7 +19,7 @@ import { sendWithHttp, OTLPExporterNodeConfigBase, CompressionAlgorithm, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; import * as path from 'path'; import { ServiceClientType } from './types'; diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/submodule.md b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/submodule.md similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/submodule.md rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/submodule.md diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts similarity index 99% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts index cf4676f9b5..67b8c17868 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/test/OTLPTraceExporter.test.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/OTLPTraceExporter.test.ts @@ -20,7 +20,7 @@ import { OTLPExporterNodeConfigBase, otlpTypes, CompressionAlgorithm, -} from '@opentelemetry/exporter-otlp-http'; +} from '@opentelemetry/exporter-trace-otlp-http'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import * as http from 'http'; @@ -34,7 +34,7 @@ import { ensureProtoSpanIsCorrect, mockedReadableSpan, MockedResponse, -} from './helper'; +} from './traceHelper'; const fakeRequest = { end: function () { }, diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/ca.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.crt rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/ca.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.key b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/ca.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/ca.key rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/ca.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/client.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.crt rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/client.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.csr b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/client.csr similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.csr rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/client.csr diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.key b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/client.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/client.key rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/client.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/regenerate.sh b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/regenerate.sh similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/regenerate.sh rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/regenerate.sh diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.crt b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/server.crt similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.crt rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/server.crt diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.csr b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/server.csr similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.csr rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/server.csr diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.key b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/server.key similarity index 100% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/certs/server.key rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/certs/server.key diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/test/helper.ts b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/traceHelper.ts similarity index 62% rename from experimental/packages/opentelemetry-exporter-otlp-proto/test/helper.ts rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/traceHelper.ts index f76b8619b0..86ff5dc32c 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/test/helper.ts +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/test/traceHelper.ts @@ -15,79 +15,13 @@ */ import { SpanStatusCode, TraceFlags } from '@opentelemetry/api'; -import { - Counter, - ObservableResult, - ObservableGauge, - Histogram, - ValueType, -} from '@opentelemetry/api-metrics'; import { hexToBase64 } from '@opentelemetry/core'; -import { otlpTypes } from '@opentelemetry/exporter-otlp-http'; -import * as metrics from '@opentelemetry/sdk-metrics-base'; +import { otlpTypes } from '@opentelemetry/exporter-trace-otlp-http'; import { Resource } from '@opentelemetry/resources'; import { ReadableSpan } from '@opentelemetry/sdk-trace-base'; import * as assert from 'assert'; import { Stream } from 'stream'; -const meterProvider = new metrics.MeterProvider({ - interval: 30000, - resource: new Resource({ - service: 'ui', - version: 1, - cost: 112.12, - }), -}); - -const meter = meterProvider.getMeter('default', '0.0.1'); - -export function mockCounter(): metrics.Metric & Counter { - const name = 'int-counter'; - const metric = - meter['_metrics'].get(name) || - meter.createCounter(name, { - description: 'sample counter description', - valueType: ValueType.INT, - }); - metric.clear(); - metric.bind({}); - return metric; -} - -export function mockObservableGauge( - callback: (observableResult: ObservableResult) => void -): metrics.Metric & ObservableGauge { - const name = 'double-observable-gauge'; - const metric = - meter['_metrics'].get(name) || - meter.createObservableGauge( - name, - { - description: 'sample observable gauge description', - valueType: ValueType.DOUBLE, - }, - callback - ); - metric.clear(); - metric.bind({}); - return metric; -} - -export function mockHistogram(): metrics.Metric & - Histogram { - const name = 'int-histogram'; - const metric = - meter['_metrics'].get(name) || - meter.createHistogram(name, { - description: 'sample histogram description', - valueType: ValueType.INT, - boundaries: [0, 100], - }); - metric.clear(); - metric.bind({}); - return metric; -} - const traceIdHex = '1f1008dc8e270e85c40a0d7c3939b278'; const spanIdHex = '5e107261f64fa53e'; const parentIdHex = '78a8915098864388'; @@ -294,74 +228,6 @@ export function ensureProtoSpanIsCorrect( ); } -export function ensureExportedCounterIsCorrect( - metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, - time?: number -) { - assert.deepStrictEqual(metric, { - name: 'int-counter', - description: 'sample counter description', - unit: '1', - intSum: { - dataPoints: [ - { - value: '1', - startTimeUnixNano: '1592602232694000128', - timeUnixNano: String(time), - }, - ], - isMonotonic: true, - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); -} - -export function ensureExportedObservableGaugeIsCorrect( - metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, - time?: number -) { - assert.deepStrictEqual(metric, { - name: 'double-observable-gauge', - description: 'sample observable gauge description', - unit: '1', - doubleGauge: { - dataPoints: [ - { - value: 6, - startTimeUnixNano: '1592602232694000128', - timeUnixNano: String(time), - }, - ], - }, - }); -} - -export function ensureExportedHistogramIsCorrect( - metric: otlpTypes.opentelemetryProto.metrics.v1.Metric, - time?: number, - explicitBounds: number[] = [Infinity], - bucketCounts: string[] = ['2', '0'] -) { - assert.deepStrictEqual(metric, { - name: 'int-histogram', - description: 'sample histogram description', - unit: '1', - intHistogram: { - dataPoints: [ - { - sum: '21', - count: '2', - startTimeUnixNano: '1592602232694000128', - timeUnixNano: time, - bucketCounts, - explicitBounds, - }, - ], - aggregationTemporality: 'AGGREGATION_TEMPORALITY_CUMULATIVE', - }, - }); -} - export function ensureExportTraceServiceRequestIsSet( json: otlpTypes.opentelemetryProto.collector.trace.v1.ExportTraceServiceRequest ) { @@ -395,39 +261,6 @@ export function ensureExportTraceServiceRequestIsSet( assert.strictEqual(spans && spans.length, 1, 'spans are missing'); } -export function ensureExportMetricsServiceRequestIsSet( - json: otlpTypes.opentelemetryProto.collector.metrics.v1.ExportMetricsServiceRequest -) { - const resourceMetrics = json.resourceMetrics; - assert.strictEqual( - resourceMetrics.length, - 1, - 'resourceMetrics has incorrect length' - ); - - const resource = resourceMetrics[0].resource; - assert.strictEqual(!!resource, true, 'resource is missing'); - - const instrumentationLibraryMetrics = - resourceMetrics[0].instrumentationLibraryMetrics; - assert.strictEqual( - instrumentationLibraryMetrics && instrumentationLibraryMetrics.length, - 1, - 'instrumentationLibraryMetrics is missing' - ); - - const instrumentationLibrary = - instrumentationLibraryMetrics[0].instrumentationLibrary; - assert.strictEqual( - !!instrumentationLibrary, - true, - 'instrumentationLibrary is missing' - ); - - const metrics = resourceMetrics[0].instrumentationLibraryMetrics[0].metrics; - assert.strictEqual(metrics.length, 3, 'Metrics are missing'); -} - export class MockedResponse extends Stream { constructor(private _code: number, private _msg?: string) { super(); diff --git a/experimental/packages/opentelemetry-exporter-otlp-proto/tsconfig.json b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/tsconfig.json similarity index 85% rename from experimental/packages/opentelemetry-exporter-otlp-proto/tsconfig.json rename to experimental/packages/opentelemetry-exporter-trace-otlp-proto/tsconfig.json index caced6b4e8..13dc2e7744 100644 --- a/experimental/packages/opentelemetry-exporter-otlp-proto/tsconfig.json +++ b/experimental/packages/opentelemetry-exporter-trace-otlp-proto/tsconfig.json @@ -13,7 +13,7 @@ "path": "../opentelemetry-api-metrics" }, { - "path": "../opentelemetry-exporter-otlp-http" + "path": "../opentelemetry-exporter-trace-otlp-http" }, { "path": "../opentelemetry-sdk-metrics-base" diff --git a/experimental/tsconfig.esm.json b/experimental/tsconfig.esm.json index a233a3b76d..d2bedd4f38 100644 --- a/experimental/tsconfig.esm.json +++ b/experimental/tsconfig.esm.json @@ -6,13 +6,13 @@ "path": "packages/opentelemetry-api-metrics/tsconfig.esm.json" }, { - "path": "packages/opentelemetry-exporter-otlp-grpc" + "path": "packages/opentelemetry-exporter-trace-otlp-grpc" }, { - "path": "packages/opentelemetry-exporter-otlp-http/tsconfig.esm.json" + "path": "packages/opentelemetry-exporter-trace-otlp-http/tsconfig.esm.json" }, { - "path": "packages/opentelemetry-exporter-otlp-proto" + "path": "packages/opentelemetry-exporter-trace-otlp-proto" }, { "path": "packages/opentelemetry-exporter-prometheus" diff --git a/experimental/tsconfig.json b/experimental/tsconfig.json index 3ae14512e2..5a53c080f2 100644 --- a/experimental/tsconfig.json +++ b/experimental/tsconfig.json @@ -6,13 +6,13 @@ "path": "packages/opentelemetry-api-metrics" }, { - "path": "packages/opentelemetry-exporter-otlp-grpc" + "path": "packages/opentelemetry-exporter-trace-otlp-grpc" }, { - "path": "packages/opentelemetry-exporter-otlp-http" + "path": "packages/opentelemetry-exporter-trace-otlp-http" }, { - "path": "packages/opentelemetry-exporter-otlp-proto" + "path": "packages/opentelemetry-exporter-trace-otlp-proto" }, { "path": "packages/opentelemetry-exporter-prometheus" @@ -32,6 +32,15 @@ { "path": "packages/opentelemetry-instrumentation" }, + { + "path": "packages/opentelemetry-exporter-metrics-otlp-http" + }, + { + "path": "packages/opentelemetry-exporter-metrics-otlp-grpc" + }, + { + "path": "packages/opentelemetry-exporter-metrics-otlp-proto" + }, { "path": "packages/opentelemetry-sdk-metrics-base" }, diff --git a/tsconfig.json b/tsconfig.json index 17cfa10261..44577914a9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,9 +4,9 @@ "typedocOptions": { "packages": [ "experimental/packages/opentelemetry-api-metrics", - "experimental/packages/opentelemetry-exporter-otlp-grpc", - "experimental/packages/opentelemetry-exporter-otlp-http", - "experimental/packages/opentelemetry-exporter-otlp-proto", + "experimental/packages/opentelemetry-exporter-trace-otlp-grpc", + "experimental/packages/opentelemetry-exporter-trace-otlp-http", + "experimental/packages/opentelemetry-exporter-trace-otlp-proto", "experimental/packages/opentelemetry-exporter-prometheus", "experimental/packages/opentelemetry-instrumentation-fetch", "experimental/packages/opentelemetry-instrumentation-grpc", @@ -14,6 +14,9 @@ "experimental/packages/opentelemetry-instrumentation-xml-http-request", "experimental/packages/opentelemetry-instrumentation", "experimental/packages/opentelemetry-sdk-node", + "experimental/packages/opentelemetry-exporter-metrics-otlp-http", + "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc", + "experimental/packages/opentelemetry-exporter-metrics-otlp-proto", "packages/opentelemetry-context-async-hooks", "packages/opentelemetry-context-zone-peer-dep", "packages/opentelemetry-context-zone",