@opentelemetry/resource-detector-instana 0.27.0 → 0.29.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 CHANGED
@@ -43,7 +43,7 @@ This package implements Semantic Convention v1.33.1.
43
43
  ### Instana Agent Detector
44
44
 
45
45
  | Resource Attribute | Description |
46
- |------------------------------|--------------------------------------------------------------------------------------------------------------------------|
46
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
47
47
  | process.pid | The ID of the process. Value of parameter `pid` from the response to a request to `/com.instana.plugin.nodejs.discovery` |
48
48
  | service.instance.id | The agent UUID. Value of parameter `agentUuid` from the response to a request to `/com.instana.plugin.nodejs.discovery` |
49
49
 
@@ -1 +1 @@
1
- {"version":3,"file":"InstanaAgentDetector.js","sourceRoot":"","sources":["../../../src/detectors/InstanaAgentDetector.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 { context, diag } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport {\n ResourceDetector,\n DetectedResource,\n DetectedResourceAttributes,\n} from '@opentelemetry/resources';\nimport { ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID } from '../semconv';\nimport * as http from 'http';\n\nclass InstanaAgentDetector implements ResourceDetector {\n readonly INSTANA_AGENT_DEFAULT_HOST = 'localhost';\n readonly INSTANA_AGENT_DEFAULT_PORT = 42699;\n\n detect(): DetectedResource {\n const dataPromise = context.with(suppressTracing(context.active()), () =>\n this._gatherData()\n );\n\n const attrNames = [ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID];\n\n const attributes = {} as DetectedResourceAttributes;\n attrNames.forEach(name => {\n // Each resource attribute is determined asynchronously in _gatherData().\n attributes[name] = dataPromise.then(data => data[name]);\n });\n\n return { attributes };\n }\n\n private async _gatherData(): Promise<DetectedResourceAttributes> {\n const host =\n process.env.INSTANA_AGENT_HOST || this.INSTANA_AGENT_DEFAULT_HOST;\n const port = Number(\n process.env.INSTANA_AGENT_PORT || this.INSTANA_AGENT_DEFAULT_PORT\n );\n\n try {\n const data = await this._retryHandler(host, port, 0);\n\n return {\n [ATTR_PROCESS_PID]: data.pid,\n [ATTR_SERVICE_INSTANCE_ID]: data.agentUuid,\n };\n } catch {\n return {};\n }\n }\n\n private timeout(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms).unref());\n }\n\n private async _retryHandler(\n host: string,\n port: number,\n tries: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const MAX_TRIES = 3;\n\n try {\n return await this._fetchAgentData(host, port);\n } catch (err) {\n if (tries < MAX_TRIES) {\n diag.debug(\n `Retrying to connect to the Instana agent on ${host}:${port}....`\n );\n\n const retryTimeout = process.env.INSTANA_RETRY_TIMEOUT_MS\n ? Number(process.env.INSTANA_RETRY_TIMEOUT_MS)\n : 1000;\n\n await this.timeout(retryTimeout);\n return await this._retryHandler(host, port, tries + 1);\n }\n\n throw err;\n }\n }\n\n private async _fetchAgentData(\n host: string,\n port: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const agentTimeoutMs = process.env.INSTANA_AGENT_TIMEOUT_MS\n ? Number(process.env.INSTANA_AGENT_TIMEOUT_MS)\n : 3 * 1000;\n\n const payload = {\n pid: process.pid,\n };\n\n const payloadStr = JSON.stringify(payload);\n const contentLength = Buffer.from(payloadStr, 'utf8').length;\n diag.debug(`Instana Agent: ${host}, ${port}`);\n\n return new Promise((resolve, reject) => {\n const opts = {\n host,\n port,\n method: 'PUT',\n path: '/com.instana.plugin.nodejs.discovery',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Content-Length': contentLength,\n },\n timeout: agentTimeoutMs,\n };\n\n const req = http.request(opts, res => {\n res.setEncoding('utf8');\n let rawData = '';\n\n res.on('data', chunk => (rawData += chunk));\n res.on('end', () => {\n if (!res.statusCode || res.statusCode !== 200) {\n return reject(\n new Error(`Instana Agent returned status code ${res.statusCode}`)\n );\n }\n\n try {\n const data = JSON.parse(rawData);\n if (data.pid && data.agentUuid) {\n return resolve(data);\n }\n\n reject(\n new Error(`Invalid Instana Agent response format: ${data}.`)\n );\n } catch (e) {\n reject(e);\n }\n });\n });\n\n req.on('timeout', () =>\n reject(new Error('Instana Agent request timed out.'))\n );\n req.on('error', err => reject(err));\n\n req.write(Buffer.from(payloadStr), 'utf8');\n req.end();\n });\n }\n}\n\nexport const instanaAgentDetector = new InstanaAgentDetector();\n"]}
1
+ {"version":3,"file":"InstanaAgentDetector.js","sourceRoot":"","sources":["../../../src/detectors/InstanaAgentDetector.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 { context, diag } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport {\n ResourceDetector,\n DetectedResource,\n DetectedResourceAttributes,\n} from '@opentelemetry/resources';\nimport { ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID } from '../semconv';\nimport * as http from 'http';\n\nclass InstanaAgentDetector implements ResourceDetector {\n public readonly INSTANA_AGENT_DEFAULT_HOST = 'localhost';\n public readonly INSTANA_AGENT_DEFAULT_PORT = 42699;\n\n public detect(): DetectedResource {\n const dataPromise = context.with(suppressTracing(context.active()), () =>\n this._gatherData()\n );\n\n const attrNames = [ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID];\n\n const attributes = {} as DetectedResourceAttributes;\n attrNames.forEach(name => {\n // Each resource attribute is determined asynchronously in _gatherData().\n attributes[name] = dataPromise.then(data => data[name]);\n });\n\n return { attributes };\n }\n\n private async _gatherData(): Promise<DetectedResourceAttributes> {\n const host =\n process.env.INSTANA_AGENT_HOST || this.INSTANA_AGENT_DEFAULT_HOST;\n const port = Number(\n process.env.INSTANA_AGENT_PORT || this.INSTANA_AGENT_DEFAULT_PORT\n );\n\n try {\n const data = await this._retryHandler(host, port, 0);\n\n return {\n [ATTR_PROCESS_PID]: data.pid,\n [ATTR_SERVICE_INSTANCE_ID]: data.agentUuid,\n };\n } catch {\n return {};\n }\n }\n\n private timeout(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms).unref());\n }\n\n private async _retryHandler(\n host: string,\n port: number,\n tries: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const MAX_TRIES = 3;\n\n try {\n return await this._fetchAgentData(host, port);\n } catch (err) {\n if (tries < MAX_TRIES) {\n diag.debug(\n `Retrying to connect to the Instana agent on ${host}:${port}....`\n );\n\n const retryTimeout = process.env.INSTANA_RETRY_TIMEOUT_MS\n ? Number(process.env.INSTANA_RETRY_TIMEOUT_MS)\n : 1000;\n\n await this.timeout(retryTimeout);\n return await this._retryHandler(host, port, tries + 1);\n }\n\n throw err;\n }\n }\n\n private async _fetchAgentData(\n host: string,\n port: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const agentTimeoutMs = process.env.INSTANA_AGENT_TIMEOUT_MS\n ? Number(process.env.INSTANA_AGENT_TIMEOUT_MS)\n : 3 * 1000;\n\n const payload = {\n pid: process.pid,\n };\n\n const payloadStr = JSON.stringify(payload);\n const contentLength = Buffer.from(payloadStr, 'utf8').length;\n diag.debug(`Instana Agent: ${host}, ${port}`);\n\n return new Promise((resolve, reject) => {\n const opts = {\n host,\n port,\n method: 'PUT',\n path: '/com.instana.plugin.nodejs.discovery',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Content-Length': contentLength,\n },\n timeout: agentTimeoutMs,\n };\n\n const req = http.request(opts, res => {\n res.setEncoding('utf8');\n let rawData = '';\n\n res.on('data', chunk => (rawData += chunk));\n res.on('end', () => {\n if (!res.statusCode || res.statusCode !== 200) {\n return reject(\n new Error(`Instana Agent returned status code ${res.statusCode}`)\n );\n }\n\n try {\n const data = JSON.parse(rawData);\n if (data.pid && data.agentUuid) {\n return resolve(data);\n }\n\n reject(\n new Error(`Invalid Instana Agent response format: ${data}.`)\n );\n } catch (e) {\n reject(e);\n }\n });\n });\n\n req.on('timeout', () =>\n reject(new Error('Instana Agent request timed out.'))\n );\n req.on('error', err => reject(err));\n\n req.write(Buffer.from(payloadStr), 'utf8');\n req.end();\n });\n }\n}\n\nexport const instanaAgentDetector = new InstanaAgentDetector();\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"InstanaAgentDetector.js","sourceRoot":"","sources":["../../../src/detectors/InstanaAgentDetector.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 { context, diag } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport {\n ResourceDetector,\n DetectedResource,\n DetectedResourceAttributes,\n} from '@opentelemetry/resources';\nimport { ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID } from '../semconv';\nimport * as http from 'http';\n\nclass InstanaAgentDetector implements ResourceDetector {\n readonly INSTANA_AGENT_DEFAULT_HOST = 'localhost';\n readonly INSTANA_AGENT_DEFAULT_PORT = 42699;\n\n detect(): DetectedResource {\n const dataPromise = context.with(suppressTracing(context.active()), () =>\n this._gatherData()\n );\n\n const attrNames = [ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID];\n\n const attributes = {} as DetectedResourceAttributes;\n attrNames.forEach(name => {\n // Each resource attribute is determined asynchronously in _gatherData().\n attributes[name] = dataPromise.then(data => data[name]);\n });\n\n return { attributes };\n }\n\n private async _gatherData(): Promise<DetectedResourceAttributes> {\n const host =\n process.env.INSTANA_AGENT_HOST || this.INSTANA_AGENT_DEFAULT_HOST;\n const port = Number(\n process.env.INSTANA_AGENT_PORT || this.INSTANA_AGENT_DEFAULT_PORT\n );\n\n try {\n const data = await this._retryHandler(host, port, 0);\n\n return {\n [ATTR_PROCESS_PID]: data.pid,\n [ATTR_SERVICE_INSTANCE_ID]: data.agentUuid,\n };\n } catch {\n return {};\n }\n }\n\n private timeout(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms).unref());\n }\n\n private async _retryHandler(\n host: string,\n port: number,\n tries: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const MAX_TRIES = 3;\n\n try {\n return await this._fetchAgentData(host, port);\n } catch (err) {\n if (tries < MAX_TRIES) {\n diag.debug(\n `Retrying to connect to the Instana agent on ${host}:${port}....`\n );\n\n const retryTimeout = process.env.INSTANA_RETRY_TIMEOUT_MS\n ? Number(process.env.INSTANA_RETRY_TIMEOUT_MS)\n : 1000;\n\n await this.timeout(retryTimeout);\n return await this._retryHandler(host, port, tries + 1);\n }\n\n throw err;\n }\n }\n\n private async _fetchAgentData(\n host: string,\n port: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const agentTimeoutMs = process.env.INSTANA_AGENT_TIMEOUT_MS\n ? Number(process.env.INSTANA_AGENT_TIMEOUT_MS)\n : 3 * 1000;\n\n const payload = {\n pid: process.pid,\n };\n\n const payloadStr = JSON.stringify(payload);\n const contentLength = Buffer.from(payloadStr, 'utf8').length;\n diag.debug(`Instana Agent: ${host}, ${port}`);\n\n return new Promise((resolve, reject) => {\n const opts = {\n host,\n port,\n method: 'PUT',\n path: '/com.instana.plugin.nodejs.discovery',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Content-Length': contentLength,\n },\n timeout: agentTimeoutMs,\n };\n\n const req = http.request(opts, res => {\n res.setEncoding('utf8');\n let rawData = '';\n\n res.on('data', chunk => (rawData += chunk));\n res.on('end', () => {\n if (!res.statusCode || res.statusCode !== 200) {\n return reject(\n new Error(`Instana Agent returned status code ${res.statusCode}`)\n );\n }\n\n try {\n const data = JSON.parse(rawData);\n if (data.pid && data.agentUuid) {\n return resolve(data);\n }\n\n reject(\n new Error(`Invalid Instana Agent response format: ${data}.`)\n );\n } catch (e) {\n reject(e);\n }\n });\n });\n\n req.on('timeout', () =>\n reject(new Error('Instana Agent request timed out.'))\n );\n req.on('error', err => reject(err));\n\n req.write(Buffer.from(payloadStr), 'utf8');\n req.end();\n });\n }\n}\n\nexport const instanaAgentDetector = new InstanaAgentDetector();\n"]}
1
+ {"version":3,"file":"InstanaAgentDetector.js","sourceRoot":"","sources":["../../../src/detectors/InstanaAgentDetector.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 { context, diag } from '@opentelemetry/api';\nimport { suppressTracing } from '@opentelemetry/core';\nimport {\n ResourceDetector,\n DetectedResource,\n DetectedResourceAttributes,\n} from '@opentelemetry/resources';\nimport { ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID } from '../semconv';\nimport * as http from 'http';\n\nclass InstanaAgentDetector implements ResourceDetector {\n public readonly INSTANA_AGENT_DEFAULT_HOST = 'localhost';\n public readonly INSTANA_AGENT_DEFAULT_PORT = 42699;\n\n public detect(): DetectedResource {\n const dataPromise = context.with(suppressTracing(context.active()), () =>\n this._gatherData()\n );\n\n const attrNames = [ATTR_PROCESS_PID, ATTR_SERVICE_INSTANCE_ID];\n\n const attributes = {} as DetectedResourceAttributes;\n attrNames.forEach(name => {\n // Each resource attribute is determined asynchronously in _gatherData().\n attributes[name] = dataPromise.then(data => data[name]);\n });\n\n return { attributes };\n }\n\n private async _gatherData(): Promise<DetectedResourceAttributes> {\n const host =\n process.env.INSTANA_AGENT_HOST || this.INSTANA_AGENT_DEFAULT_HOST;\n const port = Number(\n process.env.INSTANA_AGENT_PORT || this.INSTANA_AGENT_DEFAULT_PORT\n );\n\n try {\n const data = await this._retryHandler(host, port, 0);\n\n return {\n [ATTR_PROCESS_PID]: data.pid,\n [ATTR_SERVICE_INSTANCE_ID]: data.agentUuid,\n };\n } catch {\n return {};\n }\n }\n\n private timeout(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms).unref());\n }\n\n private async _retryHandler(\n host: string,\n port: number,\n tries: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const MAX_TRIES = 3;\n\n try {\n return await this._fetchAgentData(host, port);\n } catch (err) {\n if (tries < MAX_TRIES) {\n diag.debug(\n `Retrying to connect to the Instana agent on ${host}:${port}....`\n );\n\n const retryTimeout = process.env.INSTANA_RETRY_TIMEOUT_MS\n ? Number(process.env.INSTANA_RETRY_TIMEOUT_MS)\n : 1000;\n\n await this.timeout(retryTimeout);\n return await this._retryHandler(host, port, tries + 1);\n }\n\n throw err;\n }\n }\n\n private async _fetchAgentData(\n host: string,\n port: number\n ): Promise<{ pid: number; agentUuid: string }> {\n const agentTimeoutMs = process.env.INSTANA_AGENT_TIMEOUT_MS\n ? Number(process.env.INSTANA_AGENT_TIMEOUT_MS)\n : 3 * 1000;\n\n const payload = {\n pid: process.pid,\n };\n\n const payloadStr = JSON.stringify(payload);\n const contentLength = Buffer.from(payloadStr, 'utf8').length;\n diag.debug(`Instana Agent: ${host}, ${port}`);\n\n return new Promise((resolve, reject) => {\n const opts = {\n host,\n port,\n method: 'PUT',\n path: '/com.instana.plugin.nodejs.discovery',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Content-Length': contentLength,\n },\n timeout: agentTimeoutMs,\n };\n\n const req = http.request(opts, res => {\n res.setEncoding('utf8');\n let rawData = '';\n\n res.on('data', chunk => (rawData += chunk));\n res.on('end', () => {\n if (!res.statusCode || res.statusCode !== 200) {\n return reject(\n new Error(`Instana Agent returned status code ${res.statusCode}`)\n );\n }\n\n try {\n const data = JSON.parse(rawData);\n if (data.pid && data.agentUuid) {\n return resolve(data);\n }\n\n reject(\n new Error(`Invalid Instana Agent response format: ${data}.`)\n );\n } catch (e) {\n reject(e);\n }\n });\n });\n\n req.on('timeout', () =>\n reject(new Error('Instana Agent request timed out.'))\n );\n req.on('error', err => reject(err));\n\n req.write(Buffer.from(payloadStr), 'utf8');\n req.end();\n });\n }\n}\n\nexport const instanaAgentDetector = new InstanaAgentDetector();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentelemetry/resource-detector-instana",
3
- "version": "0.27.0",
3
+ "version": "0.29.0",
4
4
  "description": "OpenTelemetry SDK resource detector for Instana",
5
5
  "main": "build/src/index.js",
6
6
  "module": "build/esm/index.js",
@@ -43,15 +43,8 @@
43
43
  },
44
44
  "devDependencies": {
45
45
  "@opentelemetry/api": "^1.3.0",
46
- "@opentelemetry/contrib-test-utils": "^0.55.0",
47
- "@opentelemetry/sdk-node": "^0.208.0",
48
- "@types/mocha": "10.0.10",
49
- "@types/node": "18.18.14",
50
- "@types/semver": "7.5.8",
51
- "nock": "13.3.3",
52
- "nyc": "17.1.0",
53
- "rimraf": "5.0.10",
54
- "typescript": "5.0.4"
46
+ "@opentelemetry/contrib-test-utils": "^0.57.0",
47
+ "@opentelemetry/sdk-node": "^0.210.0"
55
48
  },
56
49
  "dependencies": {
57
50
  "@opentelemetry/core": "^2.0.0",
@@ -62,5 +55,5 @@
62
55
  },
63
56
  "homepage": "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/resource-detector-instana#readme",
64
57
  "sideEffects": false,
65
- "gitHead": "94e5b7da4500459e38e8d4dfda93542f22159600"
58
+ "gitHead": "c84212cca7f010b80747cccb9942474e0459df6e"
66
59
  }