@opentelemetry/instrumentation-cassandra-driver 0.54.1 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -12
- package/build/src/instrumentation.d.ts +3 -0
- package/build/src/instrumentation.js +48 -11
- package/build/src/instrumentation.js.map +1 -1
- package/build/src/semconv.d.ts +8 -0
- package/build/src/semconv.js +9 -1
- package/build/src/semconv.js.map +1 -1
- package/build/src/version.d.ts +1 -1
- package/build/src/version.js +1 -1
- package/build/src/version.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -51,18 +51,27 @@ await client.execute('select * from foo');
|
|
|
51
51
|
|
|
52
52
|
## Semantic Conventions
|
|
53
53
|
|
|
54
|
-
This
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
This instrumentation implements Semantic Conventions (semconv) v1.7.0. Since then, networking (in semconv v1.23.1) and database (in semconv v1.33.0) semantic conventions were stabilized. As of `@opentelemetry/instrumentation-cassandra-driver@0.55.0` support has been added for migrating to the stable semantic conventions using the `OTEL_SEMCONV_STABILITY_OPT_IN` environment variable as follows:
|
|
55
|
+
|
|
56
|
+
1. Upgrade to the latest version of this instrumentation package.
|
|
57
|
+
2. Set `OTEL_SEMCONV_STABILITY_OPT_IN=http/dup,database/dup` to emit both old and stable semantic conventions. (The `http` token is used to control the `net.*` attributes, the `database` token to control the `db.*` attributes.)
|
|
58
|
+
3. Modify alerts, dashboards, metrics, and other processes in your Observability system to use the stable semantic conventions.
|
|
59
|
+
4. Set `OTEL_SEMCONV_STABILITY_OPT_IN=http,database` to emit only the stable semantic conventions.
|
|
60
|
+
|
|
61
|
+
By default, if `OTEL_SEMCONV_STABILITY_OPT_IN` includes neither of the above tokens, the old v1.7.0 semconv is used. The intent is to provide an approximate 6 month time window for users of this instrumentation to migrate to the new database and networking semconv, after which a new minor version will use the new semconv by default and drop support for the old semconv.
|
|
62
|
+
|
|
63
|
+
See [the HTTP migration guide](https://opentelemetry.io/docs/specs/semconv/non-normative/http-migration/) and the [database migration guide](https://opentelemetry.io/docs/specs/semconv/non-normative/db-migration/) for details.
|
|
64
|
+
|
|
65
|
+
### Attributes
|
|
66
|
+
|
|
67
|
+
| Old semconv | Stable semconv | Description |
|
|
68
|
+
| --------------- | ---------------- | --------------------------------------- |
|
|
69
|
+
| `db.system` | `db.system.name` | Database system identifier (cassandra). |
|
|
70
|
+
| `db.statement` | `db.query.text` | The database query being executed. |
|
|
71
|
+
| `db.name` | `db.namespace` | The keyspace being accessed. |
|
|
72
|
+
| `db.user` | _(removed)_ | Username for accessing the database. |
|
|
73
|
+
| `net.peer.name` | `server.address` | Remote hostname or similar. |
|
|
74
|
+
| `net.peer.port` | `server.port` | Remote port number. |
|
|
66
75
|
|
|
67
76
|
## Useful links
|
|
68
77
|
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
|
|
2
2
|
import { CassandraDriverInstrumentationConfig } from './types';
|
|
3
3
|
export declare class CassandraDriverInstrumentation extends InstrumentationBase<CassandraDriverInstrumentationConfig> {
|
|
4
|
+
private _netSemconvStability;
|
|
5
|
+
private _dbSemconvStability;
|
|
4
6
|
constructor(config?: CassandraDriverInstrumentationConfig);
|
|
7
|
+
private _setSemconvStabilityFromEnv;
|
|
5
8
|
protected init(): InstrumentationNodeModuleDefinition;
|
|
6
9
|
private _getMaxQueryLength;
|
|
7
10
|
private _shouldIncludeDbStatement;
|
|
@@ -19,12 +19,20 @@ exports.CassandraDriverInstrumentation = void 0;
|
|
|
19
19
|
const api_1 = require("@opentelemetry/api");
|
|
20
20
|
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
21
21
|
const semconv_1 = require("./semconv");
|
|
22
|
+
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
22
23
|
/** @knipignore */
|
|
23
24
|
const version_1 = require("./version");
|
|
24
25
|
const supportedVersions = ['>=4.4.0 <5'];
|
|
25
26
|
class CassandraDriverInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
27
|
+
_netSemconvStability;
|
|
28
|
+
_dbSemconvStability;
|
|
26
29
|
constructor(config = {}) {
|
|
27
30
|
super(version_1.PACKAGE_NAME, version_1.PACKAGE_VERSION, config);
|
|
31
|
+
this._setSemconvStabilityFromEnv();
|
|
32
|
+
}
|
|
33
|
+
_setSemconvStabilityFromEnv() {
|
|
34
|
+
this._netSemconvStability = (0, instrumentation_1.semconvStabilityFromStr)('http', process.env.OTEL_SEMCONV_STABILITY_OPT_IN);
|
|
35
|
+
this._dbSemconvStability = (0, instrumentation_1.semconvStabilityFromStr)('database', process.env.OTEL_SEMCONV_STABILITY_OPT_IN);
|
|
28
36
|
}
|
|
29
37
|
init() {
|
|
30
38
|
return new instrumentation_1.InstrumentationNodeModuleDefinition('cassandra-driver', supportedVersions, driverModule => {
|
|
@@ -99,15 +107,24 @@ class CassandraDriverInstrumentation extends instrumentation_1.InstrumentationBa
|
|
|
99
107
|
}
|
|
100
108
|
_getPatchedSendOnConnection() {
|
|
101
109
|
return (original) => {
|
|
110
|
+
const plugin = this;
|
|
102
111
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
112
|
return function patchedSendOnConnection(...args) {
|
|
104
113
|
const span = api_1.trace.getSpan(api_1.context.active());
|
|
105
114
|
const conn = this['_connection'];
|
|
106
115
|
if (span !== undefined && conn !== undefined) {
|
|
107
116
|
const port = parseInt(conn.port, 10);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
117
|
+
if (plugin._netSemconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
118
|
+
span.setAttribute(semconv_1.ATTR_NET_PEER_NAME, conn.address);
|
|
119
|
+
if (!isNaN(port)) {
|
|
120
|
+
span.setAttribute(semconv_1.ATTR_NET_PEER_PORT, port);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (plugin._netSemconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
124
|
+
span.setAttribute(semantic_conventions_1.ATTR_SERVER_ADDRESS, conn.address);
|
|
125
|
+
if (!isNaN(port)) {
|
|
126
|
+
span.setAttribute(semantic_conventions_1.ATTR_SERVER_PORT, port);
|
|
127
|
+
}
|
|
111
128
|
}
|
|
112
129
|
}
|
|
113
130
|
return original.apply(this, args);
|
|
@@ -141,7 +158,9 @@ class CassandraDriverInstrumentation extends instrumentation_1.InstrumentationBa
|
|
|
141
158
|
});
|
|
142
159
|
}
|
|
143
160
|
const batchPromise = (0, instrumentation_1.safeExecuteInTheMiddle)(() => {
|
|
144
|
-
return
|
|
161
|
+
return api_1.context.with(batchContext, () => {
|
|
162
|
+
return original.apply(this, args);
|
|
163
|
+
});
|
|
145
164
|
}, error => {
|
|
146
165
|
if (error) {
|
|
147
166
|
failSpan(span, error);
|
|
@@ -179,8 +198,11 @@ class CassandraDriverInstrumentation extends instrumentation_1.InstrumentationBa
|
|
|
179
198
|
};
|
|
180
199
|
args[3] = wrappedCallback;
|
|
181
200
|
}
|
|
201
|
+
const streamContext = api_1.trace.setSpan(api_1.context.active(), span);
|
|
182
202
|
return (0, instrumentation_1.safeExecuteInTheMiddle)(() => {
|
|
183
|
-
return
|
|
203
|
+
return api_1.context.with(streamContext, () => {
|
|
204
|
+
return original.apply(this, args);
|
|
205
|
+
});
|
|
184
206
|
}, error => {
|
|
185
207
|
if (error) {
|
|
186
208
|
failSpan(span, error);
|
|
@@ -190,20 +212,35 @@ class CassandraDriverInstrumentation extends instrumentation_1.InstrumentationBa
|
|
|
190
212
|
};
|
|
191
213
|
}
|
|
192
214
|
startSpan({ op, query }, client) {
|
|
193
|
-
const attributes = {
|
|
194
|
-
|
|
195
|
-
|
|
215
|
+
const attributes = {};
|
|
216
|
+
if (this._dbSemconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
217
|
+
attributes[semconv_1.ATTR_DB_SYSTEM] = semconv_1.DB_SYSTEM_VALUE_CASSANDRA;
|
|
218
|
+
}
|
|
219
|
+
if (this._dbSemconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
220
|
+
attributes[semantic_conventions_1.ATTR_DB_SYSTEM_NAME] = semconv_1.DB_SYSTEM_NAME_VALUE_CASSANDRA;
|
|
221
|
+
}
|
|
196
222
|
if (this._shouldIncludeDbStatement() && query !== undefined) {
|
|
197
223
|
const statement = truncateQuery(query, this._getMaxQueryLength());
|
|
198
|
-
|
|
224
|
+
if (this._dbSemconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
225
|
+
attributes[semconv_1.ATTR_DB_STATEMENT] = statement;
|
|
226
|
+
}
|
|
227
|
+
if (this._dbSemconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
228
|
+
attributes[semantic_conventions_1.ATTR_DB_QUERY_TEXT] = statement;
|
|
229
|
+
}
|
|
199
230
|
}
|
|
231
|
+
// db.user (deprecated, no stable replacement - only emit with OLD)
|
|
200
232
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
233
|
const user = client.options?.credentials?.username;
|
|
202
|
-
if (user) {
|
|
234
|
+
if (user && this._dbSemconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
203
235
|
attributes[semconv_1.ATTR_DB_USER] = user;
|
|
204
236
|
}
|
|
205
237
|
if (client.keyspace) {
|
|
206
|
-
|
|
238
|
+
if (this._dbSemconvStability & instrumentation_1.SemconvStability.OLD) {
|
|
239
|
+
attributes[semconv_1.ATTR_DB_NAME] = client.keyspace;
|
|
240
|
+
}
|
|
241
|
+
if (this._dbSemconvStability & instrumentation_1.SemconvStability.STABLE) {
|
|
242
|
+
attributes[semantic_conventions_1.ATTR_DB_NAMESPACE] = client.keyspace;
|
|
243
|
+
}
|
|
207
244
|
}
|
|
208
245
|
return this.tracer.startSpan(`cassandra-driver.${op}`, {
|
|
209
246
|
kind: api_1.SpanKind.CLIENT,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n context,\n trace,\n Span,\n Attributes,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n} from '@opentelemetry/instrumentation';\nimport { CassandraDriverInstrumentationConfig, ResultSet } from './types';\nimport {\n DB_SYSTEM_VALUE_CASSANDRA,\n ATTR_DB_NAME,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_DB_USER,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n} from './semconv';\n/** @knipignore */\nimport { PACKAGE_NAME, PACKAGE_VERSION } from './version';\nimport { EventEmitter } from 'events';\nimport type * as CassandraDriver from 'cassandra-driver';\n\nconst supportedVersions = ['>=4.4.0 <5'];\n\nexport class CassandraDriverInstrumentation extends InstrumentationBase<CassandraDriverInstrumentationConfig> {\n constructor(config: CassandraDriverInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n }\n\n protected init() {\n return new InstrumentationNodeModuleDefinition(\n 'cassandra-driver',\n supportedVersions,\n driverModule => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const Client = driverModule.Client.prototype as any;\n\n if (isWrapped(Client['_execute'])) {\n this._unwrap(Client, '_execute');\n }\n\n if (isWrapped(Client.batch)) {\n this._unwrap(Client, 'batch');\n }\n\n if (isWrapped(Client.stream)) {\n this._unwrap(Client, 'stream');\n }\n\n this._wrap(Client, '_execute', this._getPatchedExecute());\n this._wrap(Client, 'batch', this._getPatchedBatch());\n this._wrap(Client, 'stream', this._getPatchedStream());\n\n return driverModule;\n },\n driverModule => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const Client = driverModule.Client.prototype as any;\n\n if (isWrapped(Client['_execute'])) {\n this._unwrap(Client, '_execute');\n }\n\n if (isWrapped(Client.batch)) {\n this._unwrap(Client, 'batch');\n }\n\n if (isWrapped(Client.stream)) {\n this._unwrap(Client, 'stream');\n }\n },\n [\n new InstrumentationNodeModuleFile(\n 'cassandra-driver/lib/request-execution.js',\n supportedVersions,\n execution => {\n if (isWrapped(execution.prototype['_sendOnConnection'])) {\n this._unwrap(execution.prototype, '_sendOnConnection');\n }\n\n this._wrap(\n execution.prototype,\n '_sendOnConnection',\n this._getPatchedSendOnConnection()\n );\n return execution;\n },\n execution => {\n if (execution === undefined) return;\n this._unwrap(execution.prototype, '_sendOnConnection');\n }\n ),\n ]\n );\n }\n\n private _getMaxQueryLength(): number {\n return this.getConfig().maxQueryLength ?? 65536;\n }\n\n private _shouldIncludeDbStatement(): boolean {\n return this.getConfig().enhancedDatabaseReporting ?? false;\n }\n\n private _getPatchedExecute() {\n return (\n original: (...args: unknown[]) => Promise<CassandraDriver.types.ResultSet>\n ) => {\n const plugin = this;\n return function patchedExecute(\n this: CassandraDriver.Client,\n ...args: unknown[]\n ) {\n const span = plugin.startSpan({ op: 'execute', query: args[0] }, this);\n\n const execContext = trace.setSpan(context.active(), span);\n const execPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(execContext, () => {\n return original.apply(this, args);\n });\n },\n error => {\n if (error) {\n failSpan(span, error);\n }\n }\n );\n\n const wrappedPromise = wrapPromise(\n span,\n execPromise,\n (span, result) => {\n plugin._callResponseHook(span, result);\n }\n );\n\n return context.bind(execContext, wrappedPromise);\n };\n };\n }\n\n private _getPatchedSendOnConnection() {\n return (original: (...args: unknown[]) => unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function patchedSendOnConnection(this: any, ...args: unknown[]) {\n const span = trace.getSpan(context.active());\n const conn = this['_connection'];\n\n if (span !== undefined && conn !== undefined) {\n const port = parseInt(conn.port, 10);\n\n span.setAttribute(ATTR_NET_PEER_NAME, conn.address);\n\n if (!isNaN(port)) {\n span.setAttribute(ATTR_NET_PEER_PORT, port);\n }\n }\n\n return original.apply(this, args);\n };\n };\n }\n\n private _getPatchedBatch() {\n return (original: (...args: unknown[]) => unknown) => {\n const plugin = this;\n return function patchedBatch(\n this: CassandraDriver.Client,\n ...args: unknown[]\n ) {\n const queries = Array.isArray(args[0]) ? args[0] : [];\n const span = plugin.startSpan(\n { op: 'batch', query: combineQueries(queries) },\n this\n );\n\n const batchContext = trace.setSpan(context.active(), span);\n\n if (typeof args[args.length - 1] === 'function') {\n const originalCallback = args[\n args.length - 1\n ] as CassandraDriver.ValueCallback<CassandraDriver.types.ResultSet>;\n\n const patchedCallback = function (\n this: unknown,\n ...cbArgs: Parameters<typeof originalCallback>\n ) {\n const error = cbArgs[0];\n\n if (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n }\n\n span.end();\n\n return originalCallback.apply(this, cbArgs);\n };\n\n args[args.length - 1] = patchedCallback;\n\n return context.with(batchContext, () => {\n return original.apply(this, args);\n });\n }\n\n const batchPromise = safeExecuteInTheMiddle(\n () => {\n return original.apply(\n this,\n args\n ) as Promise<CassandraDriver.types.ResultSet>;\n },\n error => {\n if (error) {\n failSpan(span, error);\n }\n }\n );\n\n const wrappedPromise = wrapPromise(span, batchPromise);\n\n return context.bind(batchContext, wrappedPromise);\n };\n };\n }\n\n private _getPatchedStream() {\n return (original: (...args: unknown[]) => EventEmitter) => {\n const plugin = this;\n return function patchedStream(\n this: CassandraDriver.Client,\n ...args: unknown[]\n ) {\n // Since stream internally uses execute, there is no need to add DB_STATEMENT twice\n const span = plugin.startSpan({ op: 'stream' }, this);\n\n const callback = args[3];\n\n const endSpan = (error: Error) => {\n if (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n }\n span.end();\n };\n\n if (callback === undefined) {\n args[3] = endSpan;\n } else if (typeof callback === 'function') {\n const wrappedCallback = function (this: unknown, err: Error) {\n endSpan(err);\n return callback.call(this, err);\n };\n args[3] = wrappedCallback;\n }\n\n return safeExecuteInTheMiddle(\n () => {\n return original.apply(this, args);\n },\n error => {\n if (error) {\n failSpan(span, error);\n }\n }\n );\n };\n };\n }\n\n private startSpan(\n { op, query }: { op: string; query?: unknown },\n client: CassandraDriver.Client\n ): Span {\n const attributes: Attributes = {\n [ATTR_DB_SYSTEM]: DB_SYSTEM_VALUE_CASSANDRA,\n };\n\n if (this._shouldIncludeDbStatement() && query !== undefined) {\n const statement = truncateQuery(query, this._getMaxQueryLength());\n attributes[ATTR_DB_STATEMENT] = statement;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const user = (client as any).options?.credentials?.username;\n\n if (user) {\n attributes[ATTR_DB_USER] = user;\n }\n\n if (client.keyspace) {\n attributes[ATTR_DB_NAME] = client.keyspace;\n }\n\n return this.tracer.startSpan(`cassandra-driver.${op}`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n private _callResponseHook(span: Span, response: ResultSet) {\n const { responseHook } = this.getConfig();\n if (!responseHook) {\n return;\n }\n\n safeExecuteInTheMiddle(\n () => responseHook(span, { response: response }),\n e => {\n if (e) {\n this._diag.error('responseHook error', e);\n }\n },\n true\n );\n }\n}\n\nfunction failSpan(span: Span, error: Error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n}\n\nfunction combineQueries(queries: Array<string | { query: string }>) {\n return queries\n .map(query => (typeof query === 'string' ? query : query.query))\n .join('\\n');\n}\n\nfunction wrapPromise<T>(\n span: Span,\n promise: Promise<T>,\n successCallback?: (span: Span, result: T) => void\n): Promise<T> {\n return promise\n .then(result => {\n return new Promise<T>(resolve => {\n if (successCallback) {\n successCallback(span, result);\n }\n span.end();\n resolve(result);\n });\n })\n .catch((error: Error) => {\n return new Promise<T>((_, reject) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n reject(error);\n });\n });\n}\n\nfunction truncateQuery(query: unknown, maxQueryLength: number) {\n return String(query).substring(0, maxQueryLength);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n context,\n trace,\n Span,\n Attributes,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport {\n InstrumentationBase,\n InstrumentationNodeModuleDefinition,\n InstrumentationNodeModuleFile,\n isWrapped,\n safeExecuteInTheMiddle,\n SemconvStability,\n semconvStabilityFromStr,\n} from '@opentelemetry/instrumentation';\nimport { CassandraDriverInstrumentationConfig, ResultSet } from './types';\nimport {\n DB_SYSTEM_VALUE_CASSANDRA,\n ATTR_DB_NAME,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n ATTR_DB_USER,\n ATTR_NET_PEER_NAME,\n ATTR_NET_PEER_PORT,\n DB_SYSTEM_NAME_VALUE_CASSANDRA,\n} from './semconv';\nimport {\n ATTR_DB_NAMESPACE,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions';\n/** @knipignore */\nimport { PACKAGE_NAME, PACKAGE_VERSION } from './version';\nimport { EventEmitter } from 'events';\nimport type * as CassandraDriver from 'cassandra-driver';\n\nconst supportedVersions = ['>=4.4.0 <5'];\n\nexport class CassandraDriverInstrumentation extends InstrumentationBase<CassandraDriverInstrumentationConfig> {\n private _netSemconvStability!: SemconvStability;\n private _dbSemconvStability!: SemconvStability;\n\n constructor(config: CassandraDriverInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, config);\n this._setSemconvStabilityFromEnv();\n }\n\n private _setSemconvStabilityFromEnv() {\n this._netSemconvStability = semconvStabilityFromStr(\n 'http',\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN\n );\n this._dbSemconvStability = semconvStabilityFromStr(\n 'database',\n process.env.OTEL_SEMCONV_STABILITY_OPT_IN\n );\n }\n\n protected init() {\n return new InstrumentationNodeModuleDefinition(\n 'cassandra-driver',\n supportedVersions,\n driverModule => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const Client = driverModule.Client.prototype as any;\n\n if (isWrapped(Client['_execute'])) {\n this._unwrap(Client, '_execute');\n }\n\n if (isWrapped(Client.batch)) {\n this._unwrap(Client, 'batch');\n }\n\n if (isWrapped(Client.stream)) {\n this._unwrap(Client, 'stream');\n }\n\n this._wrap(Client, '_execute', this._getPatchedExecute());\n this._wrap(Client, 'batch', this._getPatchedBatch());\n this._wrap(Client, 'stream', this._getPatchedStream());\n\n return driverModule;\n },\n driverModule => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const Client = driverModule.Client.prototype as any;\n\n if (isWrapped(Client['_execute'])) {\n this._unwrap(Client, '_execute');\n }\n\n if (isWrapped(Client.batch)) {\n this._unwrap(Client, 'batch');\n }\n\n if (isWrapped(Client.stream)) {\n this._unwrap(Client, 'stream');\n }\n },\n [\n new InstrumentationNodeModuleFile(\n 'cassandra-driver/lib/request-execution.js',\n supportedVersions,\n execution => {\n if (isWrapped(execution.prototype['_sendOnConnection'])) {\n this._unwrap(execution.prototype, '_sendOnConnection');\n }\n\n this._wrap(\n execution.prototype,\n '_sendOnConnection',\n this._getPatchedSendOnConnection()\n );\n return execution;\n },\n execution => {\n if (execution === undefined) return;\n this._unwrap(execution.prototype, '_sendOnConnection');\n }\n ),\n ]\n );\n }\n\n private _getMaxQueryLength(): number {\n return this.getConfig().maxQueryLength ?? 65536;\n }\n\n private _shouldIncludeDbStatement(): boolean {\n return this.getConfig().enhancedDatabaseReporting ?? false;\n }\n\n private _getPatchedExecute() {\n return (\n original: (...args: unknown[]) => Promise<CassandraDriver.types.ResultSet>\n ) => {\n const plugin = this;\n return function patchedExecute(\n this: CassandraDriver.Client,\n ...args: unknown[]\n ) {\n const span = plugin.startSpan({ op: 'execute', query: args[0] }, this);\n\n const execContext = trace.setSpan(context.active(), span);\n const execPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(execContext, () => {\n return original.apply(this, args);\n });\n },\n error => {\n if (error) {\n failSpan(span, error);\n }\n }\n );\n\n const wrappedPromise = wrapPromise(\n span,\n execPromise,\n (span, result) => {\n plugin._callResponseHook(span, result);\n }\n );\n\n return context.bind(execContext, wrappedPromise);\n };\n };\n }\n\n private _getPatchedSendOnConnection() {\n return (original: (...args: unknown[]) => unknown) => {\n const plugin = this;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function patchedSendOnConnection(this: any, ...args: unknown[]) {\n const span = trace.getSpan(context.active());\n const conn = this['_connection'];\n\n if (span !== undefined && conn !== undefined) {\n const port = parseInt(conn.port, 10);\n\n if (plugin._netSemconvStability & SemconvStability.OLD) {\n span.setAttribute(ATTR_NET_PEER_NAME, conn.address);\n if (!isNaN(port)) {\n span.setAttribute(ATTR_NET_PEER_PORT, port);\n }\n }\n if (plugin._netSemconvStability & SemconvStability.STABLE) {\n span.setAttribute(ATTR_SERVER_ADDRESS, conn.address);\n if (!isNaN(port)) {\n span.setAttribute(ATTR_SERVER_PORT, port);\n }\n }\n }\n\n return original.apply(this, args);\n };\n };\n }\n\n private _getPatchedBatch() {\n return (original: (...args: unknown[]) => unknown) => {\n const plugin = this;\n return function patchedBatch(\n this: CassandraDriver.Client,\n ...args: unknown[]\n ) {\n const queries = Array.isArray(args[0]) ? args[0] : [];\n const span = plugin.startSpan(\n { op: 'batch', query: combineQueries(queries) },\n this\n );\n\n const batchContext = trace.setSpan(context.active(), span);\n\n if (typeof args[args.length - 1] === 'function') {\n const originalCallback = args[\n args.length - 1\n ] as CassandraDriver.ValueCallback<CassandraDriver.types.ResultSet>;\n\n const patchedCallback = function (\n this: unknown,\n ...cbArgs: Parameters<typeof originalCallback>\n ) {\n const error = cbArgs[0];\n\n if (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n }\n\n span.end();\n\n return originalCallback.apply(this, cbArgs);\n };\n\n args[args.length - 1] = patchedCallback;\n\n return context.with(batchContext, () => {\n return original.apply(this, args);\n });\n }\n\n const batchPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(batchContext, () => {\n return original.apply(\n this,\n args\n ) as Promise<CassandraDriver.types.ResultSet>;\n });\n },\n error => {\n if (error) {\n failSpan(span, error);\n }\n }\n );\n\n const wrappedPromise = wrapPromise(span, batchPromise);\n\n return context.bind(batchContext, wrappedPromise);\n };\n };\n }\n\n private _getPatchedStream() {\n return (original: (...args: unknown[]) => EventEmitter) => {\n const plugin = this;\n return function patchedStream(\n this: CassandraDriver.Client,\n ...args: unknown[]\n ) {\n // Since stream internally uses execute, there is no need to add DB_STATEMENT twice\n const span = plugin.startSpan({ op: 'stream' }, this);\n\n const callback = args[3];\n\n const endSpan = (error: Error) => {\n if (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n }\n span.end();\n };\n\n if (callback === undefined) {\n args[3] = endSpan;\n } else if (typeof callback === 'function') {\n const wrappedCallback = function (this: unknown, err: Error) {\n endSpan(err);\n return callback.call(this, err);\n };\n args[3] = wrappedCallback;\n }\n const streamContext = trace.setSpan(context.active(), span);\n return safeExecuteInTheMiddle(\n () => {\n return context.with(streamContext, () => {\n return original.apply(this, args);\n });\n },\n error => {\n if (error) {\n failSpan(span, error);\n }\n }\n );\n };\n };\n }\n\n private startSpan(\n { op, query }: { op: string; query?: unknown },\n client: CassandraDriver.Client\n ): Span {\n const attributes: Attributes = {};\n\n if (this._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_CASSANDRA;\n }\n if (this._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_CASSANDRA;\n }\n\n if (this._shouldIncludeDbStatement() && query !== undefined) {\n const statement = truncateQuery(query, this._getMaxQueryLength());\n if (this._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_STATEMENT] = statement;\n }\n if (this._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_QUERY_TEXT] = statement;\n }\n }\n\n // db.user (deprecated, no stable replacement - only emit with OLD)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const user = (client as any).options?.credentials?.username;\n if (user && this._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_USER] = user;\n }\n\n if (client.keyspace) {\n if (this._dbSemconvStability & SemconvStability.OLD) {\n attributes[ATTR_DB_NAME] = client.keyspace;\n }\n if (this._dbSemconvStability & SemconvStability.STABLE) {\n attributes[ATTR_DB_NAMESPACE] = client.keyspace;\n }\n }\n\n return this.tracer.startSpan(`cassandra-driver.${op}`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n private _callResponseHook(span: Span, response: ResultSet) {\n const { responseHook } = this.getConfig();\n if (!responseHook) {\n return;\n }\n\n safeExecuteInTheMiddle(\n () => responseHook(span, { response: response }),\n e => {\n if (e) {\n this._diag.error('responseHook error', e);\n }\n },\n true\n );\n }\n}\n\nfunction failSpan(span: Span, error: Error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n}\n\nfunction combineQueries(queries: Array<string | { query: string }>) {\n return queries\n .map(query => (typeof query === 'string' ? query : query.query))\n .join('\\n');\n}\n\nfunction wrapPromise<T>(\n span: Span,\n promise: Promise<T>,\n successCallback?: (span: Span, result: T) => void\n): Promise<T> {\n return promise\n .then(result => {\n return new Promise<T>(resolve => {\n if (successCallback) {\n successCallback(span, result);\n }\n span.end();\n resolve(result);\n });\n })\n .catch((error: Error) => {\n return new Promise<T>((_, reject) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n reject(error);\n });\n });\n}\n\nfunction truncateQuery(query: unknown, maxQueryLength: number) {\n return String(query).substring(0, maxQueryLength);\n}\n"]}
|
package/build/src/semconv.d.ts
CHANGED
|
@@ -67,4 +67,12 @@ export declare const ATTR_NET_PEER_PORT: "net.peer.port";
|
|
|
67
67
|
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
|
|
68
68
|
*/
|
|
69
69
|
export declare const DB_SYSTEM_VALUE_CASSANDRA: "cassandra";
|
|
70
|
+
/**
|
|
71
|
+
* Enum value "cassandra" for attribute {@link ATTR_DB_SYSTEM_NAME}.
|
|
72
|
+
*
|
|
73
|
+
* [Apache Cassandra](https://cassandra.apache.org/)
|
|
74
|
+
*
|
|
75
|
+
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
|
|
76
|
+
*/
|
|
77
|
+
export declare const DB_SYSTEM_NAME_VALUE_CASSANDRA: "cassandra";
|
|
70
78
|
//# sourceMappingURL=semconv.d.ts.map
|
package/build/src/semconv.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.DB_SYSTEM_VALUE_CASSANDRA = exports.ATTR_NET_PEER_PORT = exports.ATTR_NET_PEER_NAME = exports.ATTR_DB_USER = exports.ATTR_DB_SYSTEM = exports.ATTR_DB_STATEMENT = exports.ATTR_DB_NAME = void 0;
|
|
18
|
+
exports.DB_SYSTEM_NAME_VALUE_CASSANDRA = exports.DB_SYSTEM_VALUE_CASSANDRA = exports.ATTR_NET_PEER_PORT = exports.ATTR_NET_PEER_NAME = exports.ATTR_DB_USER = exports.ATTR_DB_SYSTEM = exports.ATTR_DB_STATEMENT = exports.ATTR_DB_NAME = void 0;
|
|
19
19
|
/*
|
|
20
20
|
* This file contains a copy of unstable semantic convention definitions
|
|
21
21
|
* used by this package.
|
|
@@ -90,4 +90,12 @@ exports.ATTR_NET_PEER_PORT = 'net.peer.port';
|
|
|
90
90
|
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
|
|
91
91
|
*/
|
|
92
92
|
exports.DB_SYSTEM_VALUE_CASSANDRA = 'cassandra';
|
|
93
|
+
/**
|
|
94
|
+
* Enum value "cassandra" for attribute {@link ATTR_DB_SYSTEM_NAME}.
|
|
95
|
+
*
|
|
96
|
+
* [Apache Cassandra](https://cassandra.apache.org/)
|
|
97
|
+
*
|
|
98
|
+
* @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.
|
|
99
|
+
*/
|
|
100
|
+
exports.DB_SYSTEM_NAME_VALUE_CASSANDRA = 'cassandra';
|
|
93
101
|
//# sourceMappingURL=semconv.js.map
|
package/build/src/semconv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semconv.js","sourceRoot":"","sources":["../../src/semconv.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH;;;;GAIG;AAEH;;;;;;;;;GASG;AACU,QAAA,YAAY,GAAG,SAAkB,CAAC;AAE/C;;;;;;;;;GASG;AACU,QAAA,iBAAiB,GAAG,cAAuB,CAAC;AAEzD;;;;;;GAMG;AACU,QAAA,cAAc,GAAG,WAAoB,CAAC;AAEnD;;;;;;;;;GASG;AACU,QAAA,YAAY,GAAG,SAAkB,CAAC;AAE/C;;;;;;;;GAQG;AACU,QAAA,kBAAkB,GAAG,eAAwB,CAAC;AAE3D;;;;;;;;GAQG;AACU,QAAA,kBAAkB,GAAG,eAAwB,CAAC;AAE3D;;;;;;GAMG;AACU,QAAA,yBAAyB,GAAG,WAAoB,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * This file contains a copy of unstable semantic convention definitions\n * used by this package.\n * @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n */\n\n/**\n * Deprecated, use `db.namespace` instead.\n *\n * @example customers\n * @example main\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `db.namespace`.\n */\nexport const ATTR_DB_NAME = 'db.name' as const;\n\n/**\n * The database statement being executed.\n *\n * @example SELECT * FROM wuser_table\n * @example SET mykey \"WuValue\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `db.query.text`.\n */\nexport const ATTR_DB_STATEMENT = 'db.statement' as const;\n\n/**\n * Deprecated, use `db.system.name` instead.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `db.system.name`.\n */\nexport const ATTR_DB_SYSTEM = 'db.system' as const;\n\n/**\n * Deprecated, no replacement at this time.\n *\n * @example readonly_user\n * @example reporting_user\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Removed, no replacement at this time.\n */\nexport const ATTR_DB_USER = 'db.user' as const;\n\n/**\n * Deprecated, use `server.address` on client spans and `client.address` on server spans.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address` on client spans and `client.address` on server spans.\n */\nexport const ATTR_NET_PEER_NAME = 'net.peer.name' as const;\n\n/**\n * Deprecated, use `server.port` on client spans and `client.port` on server spans.\n *\n * @example 8080\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.port` on client spans and `client.port` on server spans.\n */\nexport const ATTR_NET_PEER_PORT = 'net.peer.port' as const;\n\n/**\n * Enum value \"cassandra\" for attribute {@link ATTR_DB_SYSTEM}.\n *\n * Apache Cassandra\n *\n * @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const DB_SYSTEM_VALUE_CASSANDRA = 'cassandra' as const;\n"]}
|
|
1
|
+
{"version":3,"file":"semconv.js","sourceRoot":"","sources":["../../src/semconv.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH;;;;GAIG;AAEH;;;;;;;;;GASG;AACU,QAAA,YAAY,GAAG,SAAkB,CAAC;AAE/C;;;;;;;;;GASG;AACU,QAAA,iBAAiB,GAAG,cAAuB,CAAC;AAEzD;;;;;;GAMG;AACU,QAAA,cAAc,GAAG,WAAoB,CAAC;AAEnD;;;;;;;;;GASG;AACU,QAAA,YAAY,GAAG,SAAkB,CAAC;AAE/C;;;;;;;;GAQG;AACU,QAAA,kBAAkB,GAAG,eAAwB,CAAC;AAE3D;;;;;;;;GAQG;AACU,QAAA,kBAAkB,GAAG,eAAwB,CAAC;AAE3D;;;;;;GAMG;AACU,QAAA,yBAAyB,GAAG,WAAoB,CAAC;AAE9D;;;;;;GAMG;AACU,QAAA,8BAA8B,GAAG,WAAoB,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * This file contains a copy of unstable semantic convention definitions\n * used by this package.\n * @see https://github.com/open-telemetry/opentelemetry-js/tree/main/semantic-conventions#unstable-semconv\n */\n\n/**\n * Deprecated, use `db.namespace` instead.\n *\n * @example customers\n * @example main\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `db.namespace`.\n */\nexport const ATTR_DB_NAME = 'db.name' as const;\n\n/**\n * The database statement being executed.\n *\n * @example SELECT * FROM wuser_table\n * @example SET mykey \"WuValue\"\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `db.query.text`.\n */\nexport const ATTR_DB_STATEMENT = 'db.statement' as const;\n\n/**\n * Deprecated, use `db.system.name` instead.\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `db.system.name`.\n */\nexport const ATTR_DB_SYSTEM = 'db.system' as const;\n\n/**\n * Deprecated, no replacement at this time.\n *\n * @example readonly_user\n * @example reporting_user\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Removed, no replacement at this time.\n */\nexport const ATTR_DB_USER = 'db.user' as const;\n\n/**\n * Deprecated, use `server.address` on client spans and `client.address` on server spans.\n *\n * @example example.com\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.address` on client spans and `client.address` on server spans.\n */\nexport const ATTR_NET_PEER_NAME = 'net.peer.name' as const;\n\n/**\n * Deprecated, use `server.port` on client spans and `client.port` on server spans.\n *\n * @example 8080\n *\n * @experimental This attribute is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n *\n * @deprecated Replaced by `server.port` on client spans and `client.port` on server spans.\n */\nexport const ATTR_NET_PEER_PORT = 'net.peer.port' as const;\n\n/**\n * Enum value \"cassandra\" for attribute {@link ATTR_DB_SYSTEM}.\n *\n * Apache Cassandra\n *\n * @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const DB_SYSTEM_VALUE_CASSANDRA = 'cassandra' as const;\n\n/**\n * Enum value \"cassandra\" for attribute {@link ATTR_DB_SYSTEM_NAME}.\n *\n * [Apache Cassandra](https://cassandra.apache.org/)\n *\n * @experimental This enum value is experimental and is subject to breaking changes in minor releases of `@opentelemetry/semantic-conventions`.\n */\nexport const DB_SYSTEM_NAME_VALUE_CASSANDRA = 'cassandra' as const;\n"]}
|
package/build/src/version.d.ts
CHANGED
package/build/src/version.js
CHANGED
|
@@ -17,6 +17,6 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.PACKAGE_NAME = exports.PACKAGE_VERSION = void 0;
|
|
19
19
|
// this is autogenerated file, see scripts/version-update.js
|
|
20
|
-
exports.PACKAGE_VERSION = '0.
|
|
20
|
+
exports.PACKAGE_VERSION = '0.55.0';
|
|
21
21
|
exports.PACKAGE_NAME = '@opentelemetry/instrumentation-cassandra-driver';
|
|
22
22
|
//# sourceMappingURL=version.js.map
|
package/build/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,YAAY,GAAG,iDAAiD,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const PACKAGE_VERSION = '0.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,YAAY,GAAG,iDAAiD,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const PACKAGE_VERSION = '0.55.0';\nexport const PACKAGE_NAME = '@opentelemetry/instrumentation-cassandra-driver';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opentelemetry/instrumentation-cassandra-driver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.55.0",
|
|
4
4
|
"description": "OpenTelemetry instrumentation for `cassandra-driver` database client library for Apache Cassandra",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"types": "build/src/index.d.ts",
|
|
@@ -52,15 +52,15 @@
|
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@opentelemetry/api": "^1.3.0",
|
|
54
54
|
"@opentelemetry/context-async-hooks": "^2.0.0",
|
|
55
|
-
"@opentelemetry/contrib-test-utils": "^0.
|
|
55
|
+
"@opentelemetry/contrib-test-utils": "^0.57.0",
|
|
56
56
|
"@opentelemetry/sdk-trace-base": "^2.0.0",
|
|
57
57
|
"@opentelemetry/sdk-trace-node": "^2.0.0",
|
|
58
|
-
"@opentelemetry/semantic-conventions": "^1.37.0",
|
|
59
58
|
"cassandra-driver": "4.6.4"
|
|
60
59
|
},
|
|
61
60
|
"dependencies": {
|
|
62
|
-
"@opentelemetry/instrumentation": "^0.
|
|
61
|
+
"@opentelemetry/instrumentation": "^0.210.0",
|
|
62
|
+
"@opentelemetry/semantic-conventions": "^1.37.0"
|
|
63
63
|
},
|
|
64
64
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-cassandra-driver#readme",
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "c84212cca7f010b80747cccb9942474e0459df6e"
|
|
66
66
|
}
|