@sebspark/opentelemetry-instrumentation-opensearch 0.3.4 → 0.3.6
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/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -5
package/dist/index.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { suppressTracing } from "@opentelemetry/core";
|
|
|
6
6
|
import { ATTR_DB_COLLECTION_NAME, ATTR_DB_OPERATION_NAME, ATTR_DB_QUERY_TEXT, ATTR_DB_SYSTEM_NAME, ATTR_HTTP_RESPONSE_STATUS_CODE, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT } from "@opentelemetry/semantic-conventions";
|
|
7
7
|
//#region package.json
|
|
8
8
|
var name = "@sebspark/opentelemetry-instrumentation-opensearch";
|
|
9
|
-
var version = "0.3.
|
|
9
|
+
var version = "0.3.6";
|
|
10
10
|
//#endregion
|
|
11
11
|
//#region src/parse-path.ts
|
|
12
12
|
const METHOD_OPERATIONS = {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["pkg.name","pkg.version"],"sources":["../package.json","../src/parse-path.ts","../src/response-attributes.ts","../src/serialize-body.ts","../src/patch-request.ts","../src/index.ts"],"sourcesContent":["","const METHOD_OPERATIONS: Record<string, string> = {\n PUT: 'indices.create',\n DELETE: 'indices.delete',\n}\n\nconst OPERATION_ALIASES: Record<string, string> = {\n doc: 'index',\n}\n\nexport const parsePath = (\n path: string,\n method?: string\n): { index?: string; operation?: string } => {\n const decoded = decodeURIComponent(path)\n const match = decoded.match(/^\\/(?:([^/_][^/]*)\\/)?_([^/]+)/)\n if (match) {\n const operation = OPERATION_ALIASES[match[2]] ?? match[2]\n return { index: match[1], operation }\n }\n\n if (method) {\n const operation = METHOD_OPERATIONS[method.toUpperCase()]\n if (operation) {\n const index = decoded.replace(/^\\//, '') || undefined\n return { index, operation }\n }\n }\n\n return {}\n}\n","import type { Types } from '@opensearch-project/opensearch'\nimport type { ApiResponse } from '@opensearch-project/opensearch/lib/Transport.js'\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions'\n\nexport const ATTR_DB_OPENSEARCH_DURATION_MS = 'db.opensearch.duration_ms'\n\nexport const extractResponseAttributes = (\n res: ApiResponse\n): Record<string, string | number | boolean> => {\n const attrs: Record<string, string | number | boolean> = {}\n\n const { hostname, port } = res.meta.connection.url\n attrs[ATTR_SERVER_ADDRESS] = hostname\n if (port) attrs[ATTR_SERVER_PORT] = Number(port)\n if (res.statusCode != null)\n attrs[ATTR_HTTP_RESPONSE_STATUS_CODE] = res.statusCode\n\n const body = res.body as Types.Core_Search.ResponseBody | null | undefined\n if (body == null) return attrs\n\n if (body.took != null) attrs['db.opensearch.took'] = body.took\n if (body.timed_out != null) attrs['db.opensearch.timed_out'] = body.timed_out\n if (body.terminated_early != null)\n attrs['db.opensearch.terminated_early'] = body.terminated_early\n\n const shards = body._shards\n if (shards != null) {\n attrs['db.opensearch.shards.total'] = shards.total\n attrs['db.opensearch.shards.successful'] = shards.successful\n attrs['db.opensearch.shards.failed'] = shards.failed\n if (shards.skipped != null)\n attrs['db.opensearch.shards.skipped'] = shards.skipped\n }\n\n const phaseTook = body.phase_took\n if (phaseTook != null) {\n attrs['db.opensearch.phase_took.can_match'] = phaseTook.can_match\n attrs['db.opensearch.phase_took.dfs_pre_query'] = phaseTook.dfs_pre_query\n attrs['db.opensearch.phase_took.dfs_query'] = phaseTook.dfs_query\n attrs['db.opensearch.phase_took.expand'] = phaseTook.expand\n attrs['db.opensearch.phase_took.fetch'] = phaseTook.fetch\n attrs['db.opensearch.phase_took.query'] = phaseTook.query\n }\n\n const total = body.hits?.total\n if (total != null && typeof total === 'object') {\n attrs['db.opensearch.hits.total'] = total.value\n }\n\n return attrs\n}\n","import type { TransportRequestParams } from '@opensearch-project/opensearch/lib/Transport.js'\nimport type { OpenSearchInstrumentationConfig } from './types'\n\nexport const serializeBody = (\n params: TransportRequestParams,\n config: Pick<OpenSearchInstrumentationConfig, 'dbStatementSerializer'>\n): string | undefined => {\n if (!params.body) return undefined\n if (config.dbStatementSerializer === false) return undefined\n if (typeof config.dbStatementSerializer === 'function') {\n return config.dbStatementSerializer(params)\n }\n return typeof params.body === 'string'\n ? params.body\n : JSON.stringify(params.body)\n}\n","import type Transport from '@opensearch-project/opensearch/lib/Transport.js'\nimport type {\n ApiError,\n ApiResponse,\n TransportRequestCallback,\n TransportRequestOptions,\n TransportRequestParams,\n TransportRequestPromise,\n} from '@opensearch-project/opensearch/lib/Transport.js'\nimport {\n context,\n SpanKind,\n SpanStatusCode,\n type Tracer,\n trace,\n} from '@opentelemetry/api'\nimport { suppressTracing } from '@opentelemetry/core'\nimport {\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n} from '@opentelemetry/semantic-conventions'\nimport { parsePath } from './parse-path'\nimport {\n ATTR_DB_OPENSEARCH_DURATION_MS,\n extractResponseAttributes,\n} from './response-attributes'\nimport { serializeBody } from './serialize-body'\nimport type { OpenSearchInstrumentationConfig } from './types'\n\nexport type OriginalRequest = (\n this: Transport,\n params: TransportRequestParams,\n options?: TransportRequestOptions\n) => TransportRequestPromise<ApiResponse>\n\ntype OriginalRequestWithCallback = (\n this: Transport,\n params: TransportRequestParams,\n options: TransportRequestOptions | undefined,\n callback: (err: ApiError, result: ApiResponse) => void\n) => TransportRequestCallback\n\nexport const createPatchedRequest = (\n getTracer: () => Tracer,\n config: OpenSearchInstrumentationConfig = {},\n original: OriginalRequest,\n clientVersion: string\n) => {\n function patchedRequest(\n params: TransportRequestParams,\n options?: TransportRequestOptions\n ): TransportRequestPromise<ApiResponse>\n function patchedRequest(\n params: TransportRequestParams,\n options: TransportRequestOptions | undefined,\n callback: (err: ApiError, result: ApiResponse) => void\n ): TransportRequestCallback\n function patchedRequest(\n this: Transport,\n params: TransportRequestParams,\n options?: TransportRequestOptions,\n callback?: (err: ApiError, result: ApiResponse) => void\n ): TransportRequestPromise<ApiResponse> | TransportRequestCallback {\n const { index, operation } = parsePath(params.path, params.method)\n const queryText = serializeBody(params, config)\n\n const span = getTracer().startSpan(\n [operation, index].filter(Boolean).join(' ') || params.path,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n [ATTR_DB_SYSTEM_NAME]: 'opensearch',\n ...(operation && { [ATTR_DB_OPERATION_NAME]: operation }),\n ...(index && { [ATTR_DB_COLLECTION_NAME]: index }),\n ...(queryText && { [ATTR_DB_QUERY_TEXT]: queryText }),\n },\n }\n )\n config.requestHook?.(span, params)\n\n const startTime = Date.now()\n\n const onSuccess = (res: ApiResponse) => {\n span.setAttribute(ATTR_DB_OPENSEARCH_DURATION_MS, Date.now() - startTime)\n for (const [key, value] of Object.entries(\n extractResponseAttributes(res)\n )) {\n span.setAttribute(key, value)\n }\n if (config.moduleVersionAttributeName) {\n span.setAttribute(config.moduleVersionAttributeName, clientVersion)\n }\n config.responseHook?.(span, res)\n span.end()\n }\n\n const onError = (err: unknown) => {\n span.setAttribute(ATTR_DB_OPENSEARCH_DURATION_MS, Date.now() - startTime)\n if (err instanceof Error) span.recordException(err)\n span.setStatus({ code: SpanStatusCode.ERROR })\n span.end()\n }\n\n const callCtx = config.suppressInternalInstrumentation\n ? suppressTracing(context.active())\n : trace.setSpan(context.active(), span)\n\n if (typeof callback === 'function') {\n const originalWithCallback = (\n original as OriginalRequestWithCallback\n ).bind(this)\n return context.with(callCtx, () =>\n originalWithCallback(params, options, (err, res) => {\n err ? onError(err) : onSuccess(res)\n callback(err, res)\n })\n )\n }\n\n const result = context.with(callCtx, () =>\n original.call(this, params, options)\n )\n const settled = result.then(\n (res: ApiResponse) => {\n onSuccess(res)\n return res\n },\n (err: unknown) => {\n onError(err)\n throw err\n }\n )\n return Object.assign(settled, { abort: result.abort })\n }\n\n return patchedRequest\n}\n","import Transport from '@opensearch-project/opensearch/lib/Transport.js'\nimport opensearchPkg from '@opensearch-project/opensearch/package.json' with {\n type: 'json',\n}\nimport { InstrumentationBase } from '@opentelemetry/instrumentation'\nimport pkg from '../package.json' with { type: 'json' }\nimport { createPatchedRequest, type OriginalRequest } from './patch-request'\nimport type { OpenSearchInstrumentationConfig } from './types'\n\nexport type { OpenSearchInstrumentationConfig } from './types'\n\nconst PACKAGE_NAME: string = pkg.name\nconst PACKAGE_VERSION: string = pkg.version\nconst OPENSEARCH_CLIENT_VERSION: string = opensearchPkg.version\n\nexport class OpenSearchInstrumentation extends InstrumentationBase {\n private readonly osConfig: OpenSearchInstrumentationConfig\n private _original: OriginalRequest | undefined\n\n constructor(config: OpenSearchInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, { ...config, enabled: false })\n this.osConfig = config\n if (config.enabled !== false) {\n this.enable()\n }\n }\n\n protected init() {}\n\n override enable() {\n if (this._original) return\n this._original = Transport.prototype.request as OriginalRequest\n Transport.prototype.request = createPatchedRequest(\n () => this.tracer,\n this.osConfig,\n this._original,\n OPENSEARCH_CLIENT_VERSION\n )\n }\n\n override disable() {\n if (this._original) {\n Transport.prototype.request = this._original\n this._original = undefined\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["pkg.name","pkg.version"],"sources":["../package.json","../src/parse-path.ts","../src/response-attributes.ts","../src/serialize-body.ts","../src/patch-request.ts","../src/index.ts"],"sourcesContent":["","const METHOD_OPERATIONS: Record<string, string> = {\n PUT: 'indices.create',\n DELETE: 'indices.delete',\n}\n\nconst OPERATION_ALIASES: Record<string, string> = {\n doc: 'index',\n}\n\nexport const parsePath = (\n path: string,\n method?: string\n): { index?: string; operation?: string } => {\n const decoded = decodeURIComponent(path)\n const match = decoded.match(/^\\/(?:([^/_][^/]*)\\/)?_([^/]+)/)\n if (match) {\n const operation = OPERATION_ALIASES[match[2]] ?? match[2]\n return { index: match[1], operation }\n }\n\n if (method) {\n const operation = METHOD_OPERATIONS[method.toUpperCase()]\n if (operation) {\n const index = decoded.replace(/^\\//, '') || undefined\n return { index, operation }\n }\n }\n\n return {}\n}\n","import type { Types } from '@opensearch-project/opensearch'\nimport type { ApiResponse } from '@opensearch-project/opensearch/lib/Transport.js'\nimport {\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n} from '@opentelemetry/semantic-conventions'\n\nexport const ATTR_DB_OPENSEARCH_DURATION_MS = 'db.opensearch.duration_ms'\n\nexport const extractResponseAttributes = (\n res: ApiResponse\n): Record<string, string | number | boolean> => {\n const attrs: Record<string, string | number | boolean> = {}\n\n const { hostname, port } = res.meta.connection.url\n attrs[ATTR_SERVER_ADDRESS] = hostname\n if (port) attrs[ATTR_SERVER_PORT] = Number(port)\n if (res.statusCode != null)\n attrs[ATTR_HTTP_RESPONSE_STATUS_CODE] = res.statusCode\n\n const body = res.body as Types.Core_Search.ResponseBody | null | undefined\n if (body == null) return attrs\n\n if (body.took != null) attrs['db.opensearch.took'] = body.took\n if (body.timed_out != null) attrs['db.opensearch.timed_out'] = body.timed_out\n if (body.terminated_early != null)\n attrs['db.opensearch.terminated_early'] = body.terminated_early\n\n const shards = body._shards\n if (shards != null) {\n attrs['db.opensearch.shards.total'] = shards.total\n attrs['db.opensearch.shards.successful'] = shards.successful\n attrs['db.opensearch.shards.failed'] = shards.failed\n if (shards.skipped != null)\n attrs['db.opensearch.shards.skipped'] = shards.skipped\n }\n\n const phaseTook = body.phase_took\n if (phaseTook != null) {\n attrs['db.opensearch.phase_took.can_match'] = phaseTook.can_match\n attrs['db.opensearch.phase_took.dfs_pre_query'] = phaseTook.dfs_pre_query\n attrs['db.opensearch.phase_took.dfs_query'] = phaseTook.dfs_query\n attrs['db.opensearch.phase_took.expand'] = phaseTook.expand\n attrs['db.opensearch.phase_took.fetch'] = phaseTook.fetch\n attrs['db.opensearch.phase_took.query'] = phaseTook.query\n }\n\n const total = body.hits?.total\n if (total != null && typeof total === 'object') {\n attrs['db.opensearch.hits.total'] = total.value\n }\n\n return attrs\n}\n","import type { TransportRequestParams } from '@opensearch-project/opensearch/lib/Transport.js'\nimport type { OpenSearchInstrumentationConfig } from './types'\n\nexport const serializeBody = (\n params: TransportRequestParams,\n config: Pick<OpenSearchInstrumentationConfig, 'dbStatementSerializer'>\n): string | undefined => {\n if (!params.body) return undefined\n if (config.dbStatementSerializer === false) return undefined\n if (typeof config.dbStatementSerializer === 'function') {\n return config.dbStatementSerializer(params)\n }\n return typeof params.body === 'string'\n ? params.body\n : JSON.stringify(params.body)\n}\n","import type Transport from '@opensearch-project/opensearch/lib/Transport.js'\nimport type {\n ApiError,\n ApiResponse,\n TransportRequestCallback,\n TransportRequestOptions,\n TransportRequestParams,\n TransportRequestPromise,\n} from '@opensearch-project/opensearch/lib/Transport.js'\nimport {\n context,\n SpanKind,\n SpanStatusCode,\n type Tracer,\n trace,\n} from '@opentelemetry/api'\nimport { suppressTracing } from '@opentelemetry/core'\nimport {\n ATTR_DB_COLLECTION_NAME,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n} from '@opentelemetry/semantic-conventions'\nimport { parsePath } from './parse-path'\nimport {\n ATTR_DB_OPENSEARCH_DURATION_MS,\n extractResponseAttributes,\n} from './response-attributes'\nimport { serializeBody } from './serialize-body'\nimport type { OpenSearchInstrumentationConfig } from './types'\n\nexport type OriginalRequest = (\n this: Transport,\n params: TransportRequestParams,\n options?: TransportRequestOptions\n) => TransportRequestPromise<ApiResponse>\n\ntype OriginalRequestWithCallback = (\n this: Transport,\n params: TransportRequestParams,\n options: TransportRequestOptions | undefined,\n callback: (err: ApiError, result: ApiResponse) => void\n) => TransportRequestCallback\n\nexport const createPatchedRequest = (\n getTracer: () => Tracer,\n config: OpenSearchInstrumentationConfig = {},\n original: OriginalRequest,\n clientVersion: string\n) => {\n function patchedRequest(\n params: TransportRequestParams,\n options?: TransportRequestOptions\n ): TransportRequestPromise<ApiResponse>\n function patchedRequest(\n params: TransportRequestParams,\n options: TransportRequestOptions | undefined,\n callback: (err: ApiError, result: ApiResponse) => void\n ): TransportRequestCallback\n function patchedRequest(\n this: Transport,\n params: TransportRequestParams,\n options?: TransportRequestOptions,\n callback?: (err: ApiError, result: ApiResponse) => void\n ): TransportRequestPromise<ApiResponse> | TransportRequestCallback {\n const { index, operation } = parsePath(params.path, params.method)\n const queryText = serializeBody(params, config)\n\n const span = getTracer().startSpan(\n [operation, index].filter(Boolean).join(' ') || params.path,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n [ATTR_DB_SYSTEM_NAME]: 'opensearch',\n ...(operation && { [ATTR_DB_OPERATION_NAME]: operation }),\n ...(index && { [ATTR_DB_COLLECTION_NAME]: index }),\n ...(queryText && { [ATTR_DB_QUERY_TEXT]: queryText }),\n },\n }\n )\n config.requestHook?.(span, params)\n\n const startTime = Date.now()\n\n const onSuccess = (res: ApiResponse) => {\n span.setAttribute(ATTR_DB_OPENSEARCH_DURATION_MS, Date.now() - startTime)\n for (const [key, value] of Object.entries(\n extractResponseAttributes(res)\n )) {\n span.setAttribute(key, value)\n }\n if (config.moduleVersionAttributeName) {\n span.setAttribute(config.moduleVersionAttributeName, clientVersion)\n }\n config.responseHook?.(span, res)\n span.end()\n }\n\n const onError = (err: unknown) => {\n span.setAttribute(ATTR_DB_OPENSEARCH_DURATION_MS, Date.now() - startTime)\n if (err instanceof Error) span.recordException(err)\n span.setStatus({ code: SpanStatusCode.ERROR })\n span.end()\n }\n\n const callCtx = config.suppressInternalInstrumentation\n ? suppressTracing(context.active())\n : trace.setSpan(context.active(), span)\n\n if (typeof callback === 'function') {\n const originalWithCallback = (\n original as OriginalRequestWithCallback\n ).bind(this)\n return context.with(callCtx, () =>\n originalWithCallback(params, options, (err, res) => {\n err ? onError(err) : onSuccess(res)\n callback(err, res)\n })\n )\n }\n\n const result = context.with(callCtx, () =>\n original.call(this, params, options)\n )\n const settled = result.then(\n (res: ApiResponse) => {\n onSuccess(res)\n return res\n },\n (err: unknown) => {\n onError(err)\n throw err\n }\n )\n return Object.assign(settled, { abort: result.abort })\n }\n\n return patchedRequest\n}\n","import Transport from '@opensearch-project/opensearch/lib/Transport.js'\nimport opensearchPkg from '@opensearch-project/opensearch/package.json' with {\n type: 'json',\n}\nimport { InstrumentationBase } from '@opentelemetry/instrumentation'\nimport pkg from '../package.json' with { type: 'json' }\nimport { createPatchedRequest, type OriginalRequest } from './patch-request'\nimport type { OpenSearchInstrumentationConfig } from './types'\n\nexport type { OpenSearchInstrumentationConfig } from './types'\n\nconst PACKAGE_NAME: string = pkg.name\nconst PACKAGE_VERSION: string = pkg.version\nconst OPENSEARCH_CLIENT_VERSION: string = opensearchPkg.version\n\nexport class OpenSearchInstrumentation extends InstrumentationBase {\n private readonly osConfig: OpenSearchInstrumentationConfig\n private _original: OriginalRequest | undefined\n\n constructor(config: OpenSearchInstrumentationConfig = {}) {\n super(PACKAGE_NAME, PACKAGE_VERSION, { ...config, enabled: false })\n this.osConfig = config\n if (config.enabled !== false) {\n this.enable()\n }\n }\n\n protected init() {}\n\n override enable() {\n if (this._original) return\n this._original = Transport.prototype.request as OriginalRequest\n Transport.prototype.request = createPatchedRequest(\n () => this.tracer,\n this.osConfig,\n this._original,\n OPENSEARCH_CLIENT_VERSION\n )\n }\n\n override disable() {\n if (this._original) {\n Transport.prototype.request = this._original\n this._original = undefined\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sebspark/opentelemetry-instrumentation-opensearch",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.mjs",
|
|
@@ -28,18 +28,21 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@opentelemetry/core": "2.7.1",
|
|
31
|
-
"@opentelemetry/instrumentation": "0.
|
|
32
|
-
"@opentelemetry/semantic-conventions": "1.
|
|
31
|
+
"@opentelemetry/instrumentation": "0.218.0",
|
|
32
|
+
"@opentelemetry/semantic-conventions": "1.41.1"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@opensearch-project/opensearch": "3.6.0",
|
|
36
36
|
"@opentelemetry/api": "1.9.1",
|
|
37
|
-
"@opentelemetry/instrumentation-http": "0.
|
|
38
|
-
"@opentelemetry/instrumentation-undici": "0.
|
|
37
|
+
"@opentelemetry/instrumentation-http": "0.218.0",
|
|
38
|
+
"@opentelemetry/instrumentation-undici": "0.28.0",
|
|
39
39
|
"@opentelemetry/sdk-trace-base": "2.7.1",
|
|
40
40
|
"@opentelemetry/sdk-trace-node": "2.7.1",
|
|
41
41
|
"@testcontainers/opensearch": "11.14.0"
|
|
42
42
|
},
|
|
43
|
+
"resolutions": {
|
|
44
|
+
"protobufjs": "8.3.0"
|
|
45
|
+
},
|
|
43
46
|
"repository": {
|
|
44
47
|
"type": "git",
|
|
45
48
|
"url": "https://github.com/seb-oss/Spark-packages.git"
|