@odigos/aws-cdk 0.0.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/.jsii +4531 -0
- package/README.md +191 -0
- package/lib/collector-config.d.ts +68 -0
- package/lib/collector-config.js +192 -0
- package/lib/generated/layers.d.ts +45 -0
- package/lib/generated/layers.js +101 -0
- package/lib/index.d.ts +6 -0
- package/lib/index.js +37 -0
- package/lib/instrumentation.d.ts +186 -0
- package/lib/instrumentation.js +212 -0
- package/lib/layer-resolver.d.ts +46 -0
- package/lib/layer-resolver.js +118 -0
- package/lib/runtime.d.ts +49 -0
- package/lib/runtime.js +119 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types.d.ts +155 -0
- package/lib/types.js +90 -0
- package/package.json +115 -0
package/README.md
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Odigos CDK constructs for AWS Lambda
|
|
2
|
+
|
|
3
|
+
Instrument AWS Lambda functions with the Odigos OpenTelemetry layer, from your own CDK app.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @odigos/aws-cdk # TypeScript / JavaScript
|
|
7
|
+
pip install odigos-aws-cdk # Python
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';
|
|
12
|
+
|
|
13
|
+
new OdigosLambdaInstrumentation(this, 'Odigos', {
|
|
14
|
+
destination: { endpoint: 'otlp.example.com:4317' },
|
|
15
|
+
functions: [apiFn, workerFn],
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
from odigos_aws_cdk import OdigosLambdaInstrumentation
|
|
21
|
+
|
|
22
|
+
OdigosLambdaInstrumentation(self, "Odigos",
|
|
23
|
+
destination={"endpoint": "otlp.example.com:4317"},
|
|
24
|
+
functions=[api_fn, worker_fn],
|
|
25
|
+
)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
That attaches the layer for each function's language and architecture, sets the exec wrapper that loads
|
|
29
|
+
the OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.
|
|
30
|
+
|
|
31
|
+
## How the telemetry actually leaves the function
|
|
32
|
+
|
|
33
|
+
Your function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector
|
|
34
|
+
running inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*
|
|
35
|
+
the handler has already returned its response.
|
|
36
|
+
|
|
37
|
+
That indirection is the whole point. A slow or unreachable destination costs billed duration, not caller
|
|
38
|
+
latency — and the collector's `decouple` processor is what holds the sandbox open until the export queue
|
|
39
|
+
drains, so a low-traffic function does not lose its telemetry to the freeze.
|
|
40
|
+
|
|
41
|
+
Consequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the
|
|
42
|
+
export back on the invocation's critical path.
|
|
43
|
+
|
|
44
|
+
## Choosing a layer source
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
new OdigosLambdaInstrumentation(this, 'Odigos', {
|
|
48
|
+
destination: { endpoint: 'otlp.example.com:4317' },
|
|
49
|
+
functions: [fn],
|
|
50
|
+
layerSource: OdigosLayerSource.IN_ACCOUNT,
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |
|
|
57
|
+
| Layer owner | the Odigos AWS account | **your** account, created by your stack |
|
|
58
|
+
| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |
|
|
59
|
+
| Environment-agnostic stacks | not supported — needs a concrete region | works |
|
|
60
|
+
| Deploy speed | unchanged | slower on first deploy |
|
|
61
|
+
|
|
62
|
+
Both install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a
|
|
63
|
+
Lambda layer owned by another AWS account. It needs the deploying principal to be allowed
|
|
64
|
+
`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.
|
|
65
|
+
|
|
66
|
+
If you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.
|
|
67
|
+
|
|
68
|
+
## Versioning
|
|
69
|
+
|
|
70
|
+
**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and
|
|
71
|
+
published by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is
|
|
72
|
+
immutable, so it means the same bytes forever.
|
|
73
|
+
|
|
74
|
+
Nothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a
|
|
75
|
+
`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that
|
|
76
|
+
changed nothing, is not a property you want.
|
|
77
|
+
|
|
78
|
+
## Handler mode vs. web-server mode
|
|
79
|
+
|
|
80
|
+
`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets
|
|
81
|
+
`AWS_LAMBDA_EXEC_WRAPPER`.
|
|
82
|
+
|
|
83
|
+
`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the
|
|
84
|
+
[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec
|
|
85
|
+
wrapper, so this mode does not touch it and loads instrumentation through the language's own loader
|
|
86
|
+
variable instead.
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
new OdigosLambdaInstrumentation(this, 'Odigos', {
|
|
90
|
+
destination: { endpoint: 'otlp.example.com:4317' },
|
|
91
|
+
functions: [webFn],
|
|
92
|
+
mode: OdigosInstrumentationMode.WEB_SERVER,
|
|
93
|
+
// NODE_OPTIONS the function already needs — ours is appended, not substituted.
|
|
94
|
+
existingLoaderValue: '--max-old-space-size=2048',
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
There is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other
|
|
99
|
+
layers, which at synth time are frequently unresolved tokens; a detector that was right most of the time
|
|
100
|
+
would silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function
|
|
101
|
+
overwrites the adapter's wrapper and the function stops serving.**
|
|
102
|
+
|
|
103
|
+
`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read
|
|
104
|
+
back an environment variable set elsewhere in your app. Omit it and the loader variable is set to the
|
|
105
|
+
Odigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.
|
|
106
|
+
|
|
107
|
+
Ruby has no verified web-server loader and is rejected at synth in this mode.
|
|
108
|
+
|
|
109
|
+
## Java handler interfaces
|
|
110
|
+
|
|
111
|
+
The Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch
|
|
112
|
+
rather than a detail level:
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
javaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
| Distro | For |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `OTEL_HANDLER` (default) | `RequestHandler` |
|
|
121
|
+
| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |
|
|
122
|
+
| `OTEL_SQS_HANDLER` | SQS events (enriched) |
|
|
123
|
+
| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |
|
|
124
|
+
|
|
125
|
+
`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a
|
|
126
|
+
different signature entirely, so wrapping it with the default **breaks the invocation** — it does not
|
|
127
|
+
merely produce thinner spans.
|
|
128
|
+
|
|
129
|
+
## Signals
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
destination: {
|
|
133
|
+
endpoint: 'otlp.example.com:4317',
|
|
134
|
+
metrics: false, // traces and logs stay on
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
A disabled signal gets no collector pipeline **and** the SDK is told not to produce it. Both halves
|
|
139
|
+
matter: a signal with no pipeline is refused at the receiver on every batch, so suppressing it at the
|
|
140
|
+
source is what stops the error loop.
|
|
141
|
+
|
|
142
|
+
Turning all three off throws at synth — a collector with no pipeline fails to start, which would leave
|
|
143
|
+
the function instrumented and silent.
|
|
144
|
+
|
|
145
|
+
## Instrumenting a whole stack
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
Aspects.of(stack).add(new OdigosInstrumentationAspect(stack, {
|
|
149
|
+
destination: { endpoint: 'otlp.example.com:4317' },
|
|
150
|
+
}));
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,
|
|
154
|
+
including ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom
|
|
155
|
+
runtimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,
|
|
156
|
+
because explicitly asking to instrument a Go function is a mistake worth failing on.
|
|
157
|
+
|
|
158
|
+
## Credentials in `headers`
|
|
159
|
+
|
|
160
|
+
`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda
|
|
161
|
+
environment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the
|
|
162
|
+
console. For a long-lived credential, prefer a destination that authenticates by network position, or
|
|
163
|
+
terminate at a collector you control.
|
|
164
|
+
|
|
165
|
+
## Do not also instrument these functions with the Odigos connector
|
|
166
|
+
|
|
167
|
+
The Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its
|
|
168
|
+
own desired state on every pass. A function instrumented here *and* enabled as a connector source ends up
|
|
169
|
+
owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
|
|
170
|
+
connector's, and every round trip publishes a new function version.
|
|
171
|
+
|
|
172
|
+
Pick one per function. These constructs never set the connector's `ODIGOS_MANAGED` ownership marker — so
|
|
173
|
+
an IaC-instrumented function is not one the connector will roll back — but the connector will take it
|
|
174
|
+
over if you enable it as a source.
|
|
175
|
+
|
|
176
|
+
## API
|
|
177
|
+
|
|
178
|
+
| Export | |
|
|
179
|
+
|---|---|
|
|
180
|
+
| `OdigosLambdaInstrumentation` | the construct; `instrument(fn)`, `instrumentAll(fns)` |
|
|
181
|
+
| `OdigosInstrumentationAspect` | applies it to every function in a scope |
|
|
182
|
+
| `OdigosDestination` | where the collector exports; exactly one of `endpoint` / `httpEndpoint` |
|
|
183
|
+
| `OdigosLayerSource` | `ODIGOS_PUBLIC` \| `IN_ACCOUNT` |
|
|
184
|
+
| `OdigosInstrumentationMode` | `HANDLER` \| `WEB_SERVER` |
|
|
185
|
+
| `OdigosJavaHandlerDistro` | the four Java wrappers |
|
|
186
|
+
| `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |
|
|
187
|
+
| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |
|
|
188
|
+
|
|
189
|
+
## License
|
|
190
|
+
|
|
191
|
+
Apache-2.0.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { OdigosDestination } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Renders the in-Lambda collector's complete configuration as an inline
|
|
4
|
+
* `OPENTELEMETRY_COLLECTOR_CONFIG_URI` value.
|
|
5
|
+
*
|
|
6
|
+
* This is a PORT of `renderCollectorConfig` in the connector
|
|
7
|
+
* (connectors/providers/aws/pkg/workload/instrumentor/collector_config.go) and is deliberately
|
|
8
|
+
* byte-for-byte compatible with it. That equivalence is not cosmetic: a function instrumented here and
|
|
9
|
+
* later enabled as a connector source is compared against the connector's rendering to decide whether it
|
|
10
|
+
* needs converging. A stray space would make every reconcile see drift and churn a new function version
|
|
11
|
+
* forever.
|
|
12
|
+
*
|
|
13
|
+
* WHY THE WHOLE DOCUMENT, RATHER THAN A FEW VARIABLES. The layer ships a baked
|
|
14
|
+
* /opt/collector-config/config.yaml, but that file is ONE document shared by every function, so it can
|
|
15
|
+
* only reach a destination through env indirection — `${env:SOMETHING}`. That made three things
|
|
16
|
+
* impossible at once:
|
|
17
|
+
*
|
|
18
|
+
* - AUTH. A credential is a headers map, not a scalar. A baked file can substitute a value but cannot
|
|
19
|
+
* conditionally grow a `headers:` block, so an authenticated destination was unreachable.
|
|
20
|
+
* - OTLP/HTTP DESTINATIONS. The baked file hardcodes a gRPC `otlp` exporter. An otlphttp-only
|
|
21
|
+
* destination resolves with an empty gRPC endpoint, and the collector does not degrade — it fails to
|
|
22
|
+
* build the pipeline and exits, so the function is instrumented, looks healthy, and exports nothing.
|
|
23
|
+
* - PER-SIGNAL PIPELINES. The baked file declares all three pipelines unconditionally, so a signal the
|
|
24
|
+
* destination does not accept is received and then fails on export rather than never being built.
|
|
25
|
+
*
|
|
26
|
+
* FLOW STYLE IS LOAD-BEARING. The document is emitted on a single line because it has to survive as an
|
|
27
|
+
* environment variable value. In a YAML flow mapping a colon must be followed by a space, or the parser
|
|
28
|
+
* reads `a:b` as the plain scalar `"a:b"` rather than a mapping. Written without the spaces the collector
|
|
29
|
+
* accepts the variable, reports the URI it read, and then fails to start with a bare
|
|
30
|
+
* `otelcol state is Closed` — no parse error, no mention of the config. Every `: ` below earns its place.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* The collector layer's own config-source variable — upstream's name, not ours. Pointed at a `yaml:` URI
|
|
34
|
+
* it carries the entire configuration inline, so no second variable is needed to hold it.
|
|
35
|
+
*
|
|
36
|
+
* Upstream also reads the older `OPENTELEMETRY_COLLECTOR_CONFIG_FILE` and logs a deprecation warning for
|
|
37
|
+
* it; this is the current name.
|
|
38
|
+
*/
|
|
39
|
+
export declare const ENV_COLLECTOR_CONFIG_URI = "OPENTELEMETRY_COLLECTOR_CONFIG_URI";
|
|
40
|
+
/** Value an unsupported signal's `OTEL_*_EXPORTER` is set to. */
|
|
41
|
+
export declare const EXPORTER_NONE = "none";
|
|
42
|
+
/** The three `OTEL_*_EXPORTER` variables, in the order the connector writes them. */
|
|
43
|
+
export declare const ENV_TRACES_EXPORTER = "OTEL_TRACES_EXPORTER";
|
|
44
|
+
export declare const ENV_METRICS_EXPORTER = "OTEL_METRICS_EXPORTER";
|
|
45
|
+
export declare const ENV_LOGS_EXPORTER = "OTEL_LOGS_EXPORTER";
|
|
46
|
+
/** Whether a signal is enabled, defaulting to on. */
|
|
47
|
+
export declare function signalEnabled(value: boolean | undefined): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Picks the exporter by the transport the destination configured. A destination carries a gRPC endpoint
|
|
50
|
+
* (type `otlp`) or an OTLP/HTTP one (type `otlphttp`); the two are different collector components with
|
|
51
|
+
* different endpoint grammars, so this is a genuine branch.
|
|
52
|
+
*/
|
|
53
|
+
export declare function exporterNameFor(dest: OdigosDestination): string;
|
|
54
|
+
/**
|
|
55
|
+
* Returns the value a signal's `OTEL_*_EXPORTER` must hold: `none` to suppress a signal the destination
|
|
56
|
+
* does not accept, or `undefined` meaning the variable must be ABSENT because the SDK's own default is
|
|
57
|
+
* already what we want.
|
|
58
|
+
*
|
|
59
|
+
* Only the "none" side is written, because `otlp` is already every OpenTelemetry SDK's default for all
|
|
60
|
+
* three signals — setting it would restate the default in three variables on every function.
|
|
61
|
+
*/
|
|
62
|
+
export declare function exporterOverrideFor(supported: boolean): string | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Renders the complete collector configuration for one destination.
|
|
65
|
+
*
|
|
66
|
+
* @throws if the destination names neither transport, both transports, or no signals at all.
|
|
67
|
+
*/
|
|
68
|
+
export declare function renderCollectorConfig(dest: OdigosDestination): string;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ENV_LOGS_EXPORTER = exports.ENV_METRICS_EXPORTER = exports.ENV_TRACES_EXPORTER = exports.EXPORTER_NONE = exports.ENV_COLLECTOR_CONFIG_URI = void 0;
|
|
4
|
+
exports.signalEnabled = signalEnabled;
|
|
5
|
+
exports.exporterNameFor = exporterNameFor;
|
|
6
|
+
exports.exporterOverrideFor = exporterOverrideFor;
|
|
7
|
+
exports.renderCollectorConfig = renderCollectorConfig;
|
|
8
|
+
/**
|
|
9
|
+
* Renders the in-Lambda collector's complete configuration as an inline
|
|
10
|
+
* `OPENTELEMETRY_COLLECTOR_CONFIG_URI` value.
|
|
11
|
+
*
|
|
12
|
+
* This is a PORT of `renderCollectorConfig` in the connector
|
|
13
|
+
* (connectors/providers/aws/pkg/workload/instrumentor/collector_config.go) and is deliberately
|
|
14
|
+
* byte-for-byte compatible with it. That equivalence is not cosmetic: a function instrumented here and
|
|
15
|
+
* later enabled as a connector source is compared against the connector's rendering to decide whether it
|
|
16
|
+
* needs converging. A stray space would make every reconcile see drift and churn a new function version
|
|
17
|
+
* forever.
|
|
18
|
+
*
|
|
19
|
+
* WHY THE WHOLE DOCUMENT, RATHER THAN A FEW VARIABLES. The layer ships a baked
|
|
20
|
+
* /opt/collector-config/config.yaml, but that file is ONE document shared by every function, so it can
|
|
21
|
+
* only reach a destination through env indirection — `${env:SOMETHING}`. That made three things
|
|
22
|
+
* impossible at once:
|
|
23
|
+
*
|
|
24
|
+
* - AUTH. A credential is a headers map, not a scalar. A baked file can substitute a value but cannot
|
|
25
|
+
* conditionally grow a `headers:` block, so an authenticated destination was unreachable.
|
|
26
|
+
* - OTLP/HTTP DESTINATIONS. The baked file hardcodes a gRPC `otlp` exporter. An otlphttp-only
|
|
27
|
+
* destination resolves with an empty gRPC endpoint, and the collector does not degrade — it fails to
|
|
28
|
+
* build the pipeline and exits, so the function is instrumented, looks healthy, and exports nothing.
|
|
29
|
+
* - PER-SIGNAL PIPELINES. The baked file declares all three pipelines unconditionally, so a signal the
|
|
30
|
+
* destination does not accept is received and then fails on export rather than never being built.
|
|
31
|
+
*
|
|
32
|
+
* FLOW STYLE IS LOAD-BEARING. The document is emitted on a single line because it has to survive as an
|
|
33
|
+
* environment variable value. In a YAML flow mapping a colon must be followed by a space, or the parser
|
|
34
|
+
* reads `a:b` as the plain scalar `"a:b"` rather than a mapping. Written without the spaces the collector
|
|
35
|
+
* accepts the variable, reports the URI it read, and then fails to start with a bare
|
|
36
|
+
* `otelcol state is Closed` — no parse error, no mention of the config. Every `: ` below earns its place.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* The collector layer's own config-source variable — upstream's name, not ours. Pointed at a `yaml:` URI
|
|
40
|
+
* it carries the entire configuration inline, so no second variable is needed to hold it.
|
|
41
|
+
*
|
|
42
|
+
* Upstream also reads the older `OPENTELEMETRY_COLLECTOR_CONFIG_FILE` and logs a deprecation warning for
|
|
43
|
+
* it; this is the current name.
|
|
44
|
+
*/
|
|
45
|
+
exports.ENV_COLLECTOR_CONFIG_URI = 'OPENTELEMETRY_COLLECTOR_CONFIG_URI';
|
|
46
|
+
/**
|
|
47
|
+
* The confmap provider that reads a configuration out of the URI itself. The collector registers
|
|
48
|
+
* env/file/yaml/http/https/s3 providers; `yaml:` is the only one that needs no second variable and no
|
|
49
|
+
* network read on a cold start.
|
|
50
|
+
*/
|
|
51
|
+
const COLLECTOR_CONFIG_SCHEME = 'yaml:';
|
|
52
|
+
/**
|
|
53
|
+
* Mirrors the baked config's processor set, and the ORDER is the contract:
|
|
54
|
+
*
|
|
55
|
+
* - `memory_limiter` first, so an export backlog is shed before it is charged to the same memory budget
|
|
56
|
+
* the customer's handler allocates from. Percentages, not `limit_mib`, because one layer serves
|
|
57
|
+
* functions from 128MB to 10GB.
|
|
58
|
+
* - `decouple` LAST. Lambda freezes the sandbox once the handler returns and every extension has called
|
|
59
|
+
* /next; a frozen sandbox runs no timers, so a batch sitting behind its timeout is flushed on a later
|
|
60
|
+
* invocation or dropped when the sandbox is reaped. `decouple` acknowledges the receive path
|
|
61
|
+
* immediately and tracks in-flight exports, which is what lets the extension hold /next open until the
|
|
62
|
+
* queue drains — after the caller already has its response.
|
|
63
|
+
*/
|
|
64
|
+
const COLLECTOR_PROCESSORS = '{memory_limiter: {check_interval: 1s, limit_percentage: 50, spike_limit_percentage: 20}, ' +
|
|
65
|
+
'batch: {send_batch_size: 512, timeout: 200ms}, decouple: null}';
|
|
66
|
+
/** Value an unsupported signal's `OTEL_*_EXPORTER` is set to. */
|
|
67
|
+
exports.EXPORTER_NONE = 'none';
|
|
68
|
+
/** The three `OTEL_*_EXPORTER` variables, in the order the connector writes them. */
|
|
69
|
+
exports.ENV_TRACES_EXPORTER = 'OTEL_TRACES_EXPORTER';
|
|
70
|
+
exports.ENV_METRICS_EXPORTER = 'OTEL_METRICS_EXPORTER';
|
|
71
|
+
exports.ENV_LOGS_EXPORTER = 'OTEL_LOGS_EXPORTER';
|
|
72
|
+
/** Whether a signal is enabled, defaulting to on. */
|
|
73
|
+
function signalEnabled(value) {
|
|
74
|
+
return value !== false;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Renders a double-quoted YAML scalar.
|
|
78
|
+
*
|
|
79
|
+
* Quoting unconditionally is what keeps a value such as a bare `host:4317` from being re-read as a nested
|
|
80
|
+
* mapping in flow context. `JSON.stringify` is the TypeScript equivalent of the connector's
|
|
81
|
+
* `strconv.Quote` for the vocabulary that matters here (`\"` and `\\`); both produce the same output for
|
|
82
|
+
* the ASCII endpoints, header names and credentials this ever sees.
|
|
83
|
+
*/
|
|
84
|
+
function yamlString(s) {
|
|
85
|
+
return JSON.stringify(s);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Picks the exporter by the transport the destination configured. A destination carries a gRPC endpoint
|
|
89
|
+
* (type `otlp`) or an OTLP/HTTP one (type `otlphttp`); the two are different collector components with
|
|
90
|
+
* different endpoint grammars, so this is a genuine branch.
|
|
91
|
+
*/
|
|
92
|
+
function exporterNameFor(dest) {
|
|
93
|
+
return dest.endpoint ? 'otlp' : 'otlphttp';
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Emits the destination's per-request headers — in practice its credential. Empty when the destination
|
|
97
|
+
* needs none, so no header block is written at all rather than an empty one.
|
|
98
|
+
*
|
|
99
|
+
* Keys are sorted so the rendered config is byte-identical across synths. The string is compared against
|
|
100
|
+
* the live function's environment to decide whether an update is needed, and map order would otherwise
|
|
101
|
+
* make every deploy look like a change.
|
|
102
|
+
*/
|
|
103
|
+
function renderHeaders(headers) {
|
|
104
|
+
if (!headers) {
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
const keys = Object.keys(headers).sort();
|
|
108
|
+
if (keys.length === 0) {
|
|
109
|
+
return '';
|
|
110
|
+
}
|
|
111
|
+
const rendered = keys.map((k) => `${yamlString(k)}: ${yamlString(headers[k])}`).join(', ');
|
|
112
|
+
return `, headers: {${rendered}}`;
|
|
113
|
+
}
|
|
114
|
+
function renderExporter(dest) {
|
|
115
|
+
let out;
|
|
116
|
+
if (dest.endpoint) {
|
|
117
|
+
// tls.insecure applies to the gRPC exporter only; the HTTP exporter takes the scheme from the URL.
|
|
118
|
+
out = `{otlp: {endpoint: ${yamlString(dest.endpoint)}, tls: {insecure: ${dest.insecure === true}}`;
|
|
119
|
+
}
|
|
120
|
+
else if (dest.httpEndpoint) {
|
|
121
|
+
out = `{otlphttp: {endpoint: ${yamlString(dest.httpEndpoint)}`;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Reached when a destination carries neither transport. Failing here is the whole point: the
|
|
125
|
+
// alternative is a collector that exits on startup while the function is reported healthy.
|
|
126
|
+
throw new Error('Odigos destination has neither `endpoint` (OTLP/gRPC) nor `httpEndpoint` (OTLP/HTTP), ' +
|
|
127
|
+
'so the in-Lambda collector would have nowhere to export.');
|
|
128
|
+
}
|
|
129
|
+
return `${out}${renderHeaders(dest.headers)}}}`;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Builds a pipeline only for the signals the destination accepts. A signal with no pipeline is refused at
|
|
133
|
+
* the receiver, which is the behaviour we want: the SDK is told not to produce it either (see
|
|
134
|
+
* `exporterOverrideFor`), and the two together mean an unaccepted signal is never generated, never
|
|
135
|
+
* exported, and never a per-batch error against a backend that does not implement it.
|
|
136
|
+
*/
|
|
137
|
+
function renderPipelines(dest, exporterName) {
|
|
138
|
+
const parts = [];
|
|
139
|
+
const signals = [
|
|
140
|
+
['traces', signalEnabled(dest.traces)],
|
|
141
|
+
['metrics', signalEnabled(dest.metrics)],
|
|
142
|
+
['logs', signalEnabled(dest.logs)],
|
|
143
|
+
];
|
|
144
|
+
for (const [name, enabled] of signals) {
|
|
145
|
+
if (!enabled) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
parts.push(`${name}: {receivers: [otlp], processors: [memory_limiter, batch, decouple], exporters: [${exporterName}]}`);
|
|
149
|
+
}
|
|
150
|
+
return parts.length === 0 ? '' : `{${parts.join(', ')}}`;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Returns the value a signal's `OTEL_*_EXPORTER` must hold: `none` to suppress a signal the destination
|
|
154
|
+
* does not accept, or `undefined` meaning the variable must be ABSENT because the SDK's own default is
|
|
155
|
+
* already what we want.
|
|
156
|
+
*
|
|
157
|
+
* Only the "none" side is written, because `otlp` is already every OpenTelemetry SDK's default for all
|
|
158
|
+
* three signals — setting it would restate the default in three variables on every function.
|
|
159
|
+
*/
|
|
160
|
+
function exporterOverrideFor(supported) {
|
|
161
|
+
return supported ? undefined : exports.EXPORTER_NONE;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Renders the complete collector configuration for one destination.
|
|
165
|
+
*
|
|
166
|
+
* @throws if the destination names neither transport, both transports, or no signals at all.
|
|
167
|
+
*/
|
|
168
|
+
function renderCollectorConfig(dest) {
|
|
169
|
+
if (dest.endpoint && dest.httpEndpoint) {
|
|
170
|
+
throw new Error('Odigos destination sets both `endpoint` (OTLP/gRPC) and `httpEndpoint` (OTLP/HTTP); ' +
|
|
171
|
+
'they select different collector exporters, so exactly one must be set.');
|
|
172
|
+
}
|
|
173
|
+
const exporter = renderExporter(dest);
|
|
174
|
+
const pipelines = renderPipelines(dest, exporterNameFor(dest));
|
|
175
|
+
if (pipelines === '') {
|
|
176
|
+
throw new Error('Odigos destination accepts no telemetry signals (traces, metrics and logs are all false), ' +
|
|
177
|
+
'so the collector would have no pipeline to build and would fail to start.');
|
|
178
|
+
}
|
|
179
|
+
return (COLLECTOR_CONFIG_SCHEME +
|
|
180
|
+
'{receivers: {otlp: {protocols: ' +
|
|
181
|
+
// Bound to localhost: the receiver exists only for the in-process SDK. Binding it wider would expose
|
|
182
|
+
// an unauthenticated OTLP endpoint on the sandbox's network interface.
|
|
183
|
+
'{grpc: {endpoint: "localhost:4317"}, http: {endpoint: "localhost:4318"}}}}, ' +
|
|
184
|
+
'processors: ' +
|
|
185
|
+
COLLECTOR_PROCESSORS +
|
|
186
|
+
', exporters: ' +
|
|
187
|
+
exporter +
|
|
188
|
+
', service: {telemetry: {metrics: {level: none}}, pipelines: ' +
|
|
189
|
+
pipelines +
|
|
190
|
+
'}}');
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0b3ItY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBFQSxzQ0FFQztBQW1CRCwwQ0FFQztBQXdFRCxrREFFQztBQU9ELHNEQStCQztBQS9NRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSDs7Ozs7O0dBTUc7QUFDVSxRQUFBLHdCQUF3QixHQUFHLG9DQUFvQyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQ3hCLDJGQUEyRjtJQUMzRixnRUFBZ0UsQ0FBQztBQUVuRSxpRUFBaUU7QUFDcEQsUUFBQSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRXBDLHFGQUFxRjtBQUN4RSxRQUFBLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQzdDLFFBQUEsb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDL0MsUUFBQSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUV0RCxxREFBcUQ7QUFDckQsU0FBZ0IsYUFBYSxDQUFDLEtBQTBCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLElBQXVCO0lBQ3JELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxPQUFtQztJQUN4RCxJQUFJLENBQUMs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QUFJLENBQUMsQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksU0FBUyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEZBQTRGO1lBQzFGLDJFQUEyRSxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCx1QkFBdUI7UUFDdkIsaUNBQWlDO1FBQ2pDLHFHQUFxRztRQUNyRyx1RUFBdUU7UUFDdkUsOEVBQThFO1FBQzlFLGNBQWM7UUFDZCxvQkFBb0I7UUFDcEIsZUFBZTtRQUNmLFFBQVE7UUFDUiw4REFBOEQ7UUFDOUQsU0FBUztRQUNULElBQUksQ0FDTCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9kaWdvc0Rlc3RpbmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvcidzIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gYXMgYW4gaW5saW5lXG4gKiBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAgdmFsdWUuXG4gKlxuICogVGhpcyBpcyBhIFBPUlQgb2YgYHJlbmRlckNvbGxlY3RvckNvbmZpZ2AgaW4gdGhlIGNvbm5lY3RvclxuICogKGNvbm5lY3RvcnMvcHJvdmlkZXJzL2F3cy9wa2cvd29ya2xvYWQvaW5zdHJ1bWVudG9yL2NvbGxlY3Rvcl9jb25maWcuZ28pIGFuZCBpcyBkZWxpYmVyYXRlbHlcbiAqIGJ5dGUtZm9yLWJ5dGUgY29tcGF0aWJsZSB3aXRoIGl0LiBUaGF0IGVxdWl2YWxlbmNlIGlzIG5vdCBjb3NtZXRpYzogYSBmdW5jdGlvbiBpbnN0cnVtZW50ZWQgaGVyZSBhbmRcbiAqIGxhdGVyIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIGNvbm5lY3RvcidzIHJlbmRlcmluZyB0byBkZWNpZGUgd2hldGhlciBpdFxuICogbmVlZHMgY29udmVyZ2luZy4gQSBzdHJheSBzcGFjZSB3b3VsZCBtYWtlIGV2ZXJ5IHJlY29uY2lsZSBzZWUgZHJpZnQgYW5kIGNodXJuIGEgbmV3IGZ1bmN0aW9uIHZlcnNpb25cbiAqIGZvcmV2ZXIuXG4gKlxuICogV0hZIFRIRSBXSE9MRSBET0NVTUVOVCwgUkFUSEVSIFRIQU4gQSBGRVcgVkFSSUFCTEVTLiBUaGUgbGF5ZXIgc2hpcHMgYSBiYWtlZFxuICogL29wdC9jb2xsZWN0b3ItY29uZmlnL2NvbmZpZy55YW1sLCBidXQgdGhhdCBmaWxlIGlzIE9ORSBkb2N1bWVudCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24sIHNvIGl0IGNhblxuICogb25seSByZWFjaCBhIGRlc3RpbmF0aW9uIHRocm91Z2ggZW52IGluZGlyZWN0aW9uIOKAlCBgJHtlbnY6U09NRVRISU5HfWAuIFRoYXQgbWFkZSB0aHJlZSB0aGluZ3NcbiAqIGltcG9zc2libGUgYXQgb25jZTpcbiAqXG4gKiAgIC0gQVVUSC4gQSBjcmVkZW50aWFsIGlzIGEgaGVhZGVycyBtYXAsIG5vdCBhIHNjYWxhci4gQSBiYWtlZCBmaWxlIGNhbiBzdWJzdGl0dXRlIGEgdmFsdWUgYnV0IGNhbm5vdFxuICogICAgIGNvbmRpdGlvbmFsbHkgZ3JvdyBhIGBoZWFkZXJzOmAgYmxvY2ssIHNvIGFuIGF1dGhlbnRpY2F0ZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLlxuICogICAtIE9UTFAvSFRUUCBERVNUSU5BVElPTlMuIFRoZSBiYWtlZCBmaWxlIGhhcmRjb2RlcyBhIGdSUEMgYG90bHBgIGV4cG9ydGVyLiBBbiBvdGxwaHR0cC1vbmx5XG4gKiAgICAgZGVzdGluYXRpb24gcmVzb2x2ZXMgd2l0aCBhbiBlbXB0eSBnUlBDIGVuZHBvaW50LCBhbmQgdGhlIGNvbGxlY3RvciBkb2VzIG5vdCBkZWdyYWRlIOKAlCBpdCBmYWlscyB0b1xuICogICAgIGJ1aWxkIHRoZSBwaXBlbGluZSBhbmQgZXhpdHMsIHNvIHRoZSBmdW5jdGlvbiBpcyBpbnN0cnVtZW50ZWQsIGxvb2tzIGhlYWx0aHksIGFuZCBleHBvcnRzIG5vdGhpbmcuXG4gKiAgIC0gUEVSLVNJR05BTCBQSVBFTElORVMuIFRoZSBiYWtlZCBmaWxlIGRlY2xhcmVzIGFsbCB0aHJlZSBwaXBlbGluZXMgdW5jb25kaXRpb25hbGx5LCBzbyBhIHNpZ25hbCB0aGVcbiAqICAgICBkZXN0aW5hdGlvbiBkb2VzIG5vdCBhY2NlcHQgaXMgcmVjZWl2ZWQgYW5kIHRoZW4gZmFpbHMgb24gZXhwb3J0IHJhdGhlciB0aGFuIG5ldmVyIGJlaW5nIGJ1aWx0LlxuICpcbiAqIEZMT1cgU1RZTEUgSVMgTE9BRC1CRUFSSU5HLiBUaGUgZG9jdW1lbnQgaXMgZW1pdHRlZCBvbiBhIHNpbmdsZSBsaW5lIGJlY2F1c2UgaXQgaGFzIHRvIHN1cnZpdmUgYXMgYW5cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlLiBJbiBhIFlBTUwgZmxvdyBtYXBwaW5nIGEgY29sb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlLCBvciB0aGUgcGFyc2VyXG4gKiByZWFkcyBgYTpiYCBhcyB0aGUgcGxhaW4gc2NhbGFyIGBcImE6YlwiYCByYXRoZXIgdGhhbiBhIG1hcHBpbmcuIFdyaXR0ZW4gd2l0aG91dCB0aGUgc3BhY2VzIHRoZSBjb2xsZWN0b3JcbiAqIGFjY2VwdHMgdGhlIHZhcmlhYmxlLCByZXBvcnRzIHRoZSBVUkkgaXQgcmVhZCwgYW5kIHRoZW4gZmFpbHMgdG8gc3RhcnQgd2l0aCBhIGJhcmVcbiAqIGBvdGVsY29sIHN0YXRlIGlzIENsb3NlZGAg4oCUIG5vIHBhcnNlIGVycm9yLCBubyBtZW50aW9uIG9mIHRoZSBjb25maWcuIEV2ZXJ5IGA6IGAgYmVsb3cgZWFybnMgaXRzIHBsYWNlLlxuICovXG5cbi8qKlxuICogVGhlIGNvbGxlY3RvciBsYXllcidzIG93biBjb25maWctc291cmNlIHZhcmlhYmxlIOKAlCB1cHN0cmVhbSdzIG5hbWUsIG5vdCBvdXJzLiBQb2ludGVkIGF0IGEgYHlhbWw6YCBVUklcbiAqIGl0IGNhcnJpZXMgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGlubGluZSwgc28gbm8gc2Vjb25kIHZhcmlhYmxlIGlzIG5lZWRlZCB0byBob2xkIGl0LlxuICpcbiAqIFVwc3RyZWFtIGFsc28gcmVhZHMgdGhlIG9sZGVyIGBPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfRklMRWAgYW5kIGxvZ3MgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvclxuICogaXQ7IHRoaXMgaXMgdGhlIGN1cnJlbnQgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVOVl9DT0xMRUNUT1JfQ09ORklHX1VSSSA9ICdPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfVVJJJztcblxuLyoqXG4gKiBUaGUgY29uZm1hcCBwcm92aWRlciB0aGF0IHJlYWRzIGEgY29uZmlndXJhdGlvbiBvdXQgb2YgdGhlIFVSSSBpdHNlbGYuIFRoZSBjb2xsZWN0b3IgcmVnaXN0ZXJzXG4gKiBlbnYvZmlsZS95YW1sL2h0dHAvaHR0cHMvczMgcHJvdmlkZXJzOyBgeWFtbDpgIGlzIHRoZSBvbmx5IG9uZSB0aGF0IG5lZWRzIG5vIHNlY29uZCB2YXJpYWJsZSBhbmQgbm9cbiAqIG5ldHdvcmsgcmVhZCBvbiBhIGNvbGQgc3RhcnQuXG4gKi9cbmNvbnN0IENPTExFQ1RPUl9DT05GSUdfU0NIRU1FID0gJ3lhbWw6JztcblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBiYWtlZCBjb25maWcncyBwcm9jZXNzb3Igc2V0LCBhbmQgdGhlIE9SREVSIGlzIHRoZSBjb250cmFjdDpcbiAqXG4gKiAgIC0gYG1lbW9yeV9saW1pdGVyYCBmaXJzdCwgc28gYW4gZXhwb3J0IGJhY2tsb2cgaXMgc2hlZCBiZWZvcmUgaXQgaXMgY2hhcmdlZCB0byB0aGUgc2FtZSBtZW1vcnkgYnVkZ2V0XG4gKiAgICAgdGhlIGN1c3RvbWVyJ3MgaGFuZGxlciBhbGxvY2F0ZXMgZnJvbS4gUGVyY2VudGFnZXMsIG5vdCBgbGltaXRfbWliYCwgYmVjYXVzZSBvbmUgbGF5ZXIgc2VydmVzXG4gKiAgICAgZnVuY3Rpb25zIGZyb20gMTI4TUIgdG8gMTBHQi5cbiAqICAgLSBgZGVjb3VwbGVgIExBU1QuIExhbWJkYSBmcmVlemVzIHRoZSBzYW5kYm94IG9uY2UgdGhlIGhhbmRsZXIgcmV0dXJucyBhbmQgZXZlcnkgZXh0ZW5zaW9uIGhhcyBjYWxsZWRcbiAqICAgICAvbmV4dDsgYSBmcm96ZW4gc2FuZGJveCBydW5zIG5vIHRpbWVycywgc28gYSBiYXRjaCBzaXR0aW5nIGJlaGluZCBpdHMgdGltZW91dCBpcyBmbHVzaGVkIG9uIGEgbGF0ZXJcbiAqICAgICBpbnZvY2F0aW9uIG9yIGRyb3BwZWQgd2hlbiB0aGUgc2FuZGJveCBpcyByZWFwZWQuIGBkZWNvdXBsZWAgYWNrbm93bGVkZ2VzIHRoZSByZWNlaXZlIHBhdGhcbiAqICAgICBpbW1lZGlhdGVseSBhbmQgdHJhY2tzIGluLWZsaWdodCBleHBvcnRzLCB3aGljaCBpcyB3aGF0IGxldHMgdGhlIGV4dGVuc2lvbiBob2xkIC9uZXh0IG9wZW4gdW50aWwgdGhlXG4gKiAgICAgcXVldWUgZHJhaW5zIOKAlCBhZnRlciB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGl0cyByZXNwb25zZS5cbiAqL1xuY29uc3QgQ09MTEVDVE9SX1BST0NFU1NPUlMgPVxuICAne21lbW9yeV9saW1pdGVyOiB7Y2hlY2tfaW50ZXJ2YWw6IDFzLCBsaW1pdF9wZXJjZW50YWdlOiA1MCwgc3Bpa2VfbGltaXRfcGVyY2VudGFnZTogMjB9LCAnICtcbiAgJ2JhdGNoOiB7c2VuZF9iYXRjaF9zaXplOiA1MTIsIHRpbWVvdXQ6IDIwMG1zfSwgZGVjb3VwbGU6IG51bGx9JztcblxuLyoqIFZhbHVlIGFuIHVuc3VwcG9ydGVkIHNpZ25hbCdzIGBPVEVMXypfRVhQT1JURVJgIGlzIHNldCB0by4gKi9cbmV4cG9ydCBjb25zdCBFWFBPUlRFUl9OT05FID0gJ25vbmUnO1xuXG4vKiogVGhlIHRocmVlIGBPVEVMXypfRVhQT1JURVJgIHZhcmlhYmxlcywgaW4gdGhlIG9yZGVyIHRoZSBjb25uZWN0b3Igd3JpdGVzIHRoZW0uICovXG5leHBvcnQgY29uc3QgRU5WX1RSQUNFU19FWFBPUlRFUiA9ICdPVEVMX1RSQUNFU19FWFBPUlRFUic7XG5leHBvcnQgY29uc3QgRU5WX01FVFJJQ1NfRVhQT1JURVIgPSAnT1RFTF9NRVRSSUNTX0VYUE9SVEVSJztcbmV4cG9ydCBjb25zdCBFTlZfTE9HU19FWFBPUlRFUiA9ICdPVEVMX0xPR1NfRVhQT1JURVInO1xuXG4vKiogV2hldGhlciBhIHNpZ25hbCBpcyBlbmFibGVkLCBkZWZhdWx0aW5nIHRvIG9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgZG91YmxlLXF1b3RlZCBZQU1MIHNjYWxhci5cbiAqXG4gKiBRdW90aW5nIHVuY29uZGl0aW9uYWxseSBpcyB3aGF0IGtlZXBzIGEgdmFsdWUgc3VjaCBhcyBhIGJhcmUgYGhvc3Q6NDMxN2AgZnJvbSBiZWluZyByZS1yZWFkIGFzIGEgbmVzdGVkXG4gKiBtYXBwaW5nIGluIGZsb3cgY29udGV4dC4gYEpTT04uc3RyaW5naWZ5YCBpcyB0aGUgVHlwZVNjcmlwdCBlcXVpdmFsZW50IG9mIHRoZSBjb25uZWN0b3Inc1xuICogYHN0cmNvbnYuUXVvdGVgIGZvciB0aGUgdm9jYWJ1bGFyeSB0aGF0IG1hdHRlcnMgaGVyZSAoYFxcXCJgIGFuZCBgXFxcXGApOyBib3RoIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0IGZvclxuICogdGhlIEFTQ0lJIGVuZHBvaW50cywgaGVhZGVyIG5hbWVzIGFuZCBjcmVkZW50aWFscyB0aGlzIGV2ZXIgc2Vlcy5cbiAqL1xuZnVuY3Rpb24geWFtbFN0cmluZyhzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocyk7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGV4cG9ydGVyIGJ5IHRoZSB0cmFuc3BvcnQgdGhlIGRlc3RpbmF0aW9uIGNvbmZpZ3VyZWQuIEEgZGVzdGluYXRpb24gY2FycmllcyBhIGdSUEMgZW5kcG9pbnRcbiAqICh0eXBlIGBvdGxwYCkgb3IgYW4gT1RMUC9IVFRQIG9uZSAodHlwZSBgb3RscGh0dHBgKTsgdGhlIHR3byBhcmUgZGlmZmVyZW50IGNvbGxlY3RvciBjb21wb25lbnRzIHdpdGhcbiAqIGRpZmZlcmVudCBlbmRwb2ludCBncmFtbWFycywgc28gdGhpcyBpcyBhIGdlbnVpbmUgYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0ZXJOYW1lRm9yKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlc3QuZW5kcG9pbnQgPyAnb3RscCcgOiAnb3RscGh0dHAnO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZXN0aW5hdGlvbidzIHBlci1yZXF1ZXN0IGhlYWRlcnMg4oCUIGluIHByYWN0aWNlIGl0cyBjcmVkZW50aWFsLiBFbXB0eSB3aGVuIHRoZSBkZXN0aW5hdGlvblxuICogbmVlZHMgbm9uZSwgc28gbm8gaGVhZGVyIGJsb2NrIGlzIHdyaXR0ZW4gYXQgYWxsIHJhdGhlciB0aGFuIGFuIGVtcHR5IG9uZS5cbiAqXG4gKiBLZXlzIGFyZSBzb3J0ZWQgc28gdGhlIHJlbmRlcmVkIGNvbmZpZyBpcyBieXRlLWlkZW50aWNhbCBhY3Jvc3Mgc3ludGhzLiBUaGUgc3RyaW5nIGlzIGNvbXBhcmVkIGFnYWluc3RcbiAqIHRoZSBsaXZlIGZ1bmN0aW9uJ3MgZW52aXJvbm1lbnQgdG8gZGVjaWRlIHdoZXRoZXIgYW4gdXBkYXRlIGlzIG5lZWRlZCwgYW5kIG1hcCBvcmRlciB3b3VsZCBvdGhlcndpc2VcbiAqIG1ha2UgZXZlcnkgZGVwbG95IGxvb2sgbGlrZSBhIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVySGVhZGVycyhoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGlmICghaGVhZGVycykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29ydCgpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcmVuZGVyZWQgPSBrZXlzLm1hcCgoaykgPT4gYCR7eWFtbFN0cmluZyhrKX06ICR7eWFtbFN0cmluZyhoZWFkZXJzW2tdKX1gKS5qb2luKCcsICcpO1xuICByZXR1cm4gYCwgaGVhZGVyczogeyR7cmVuZGVyZWR9fWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckV4cG9ydGVyKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgbGV0IG91dDogc3RyaW5nO1xuICBpZiAoZGVzdC5lbmRwb2ludCkge1xuICAgIC8vIHRscy5pbnNlY3VyZSBhcHBsaWVzIHRvIHRoZSBnUlBDIGV4cG9ydGVyIG9ubHk7IHRoZSBIVFRQIGV4cG9ydGVyIHRha2VzIHRoZSBzY2hlbWUgZnJvbSB0aGUgVVJMLlxuICAgIG91dCA9IGB7b3RscDoge2VuZHBvaW50OiAke3lhbWxTdHJpbmcoZGVzdC5lbmRwb2ludCl9LCB0bHM6IHtpbnNlY3VyZTogJHtkZXN0Lmluc2VjdXJlID09PSB0cnVlfX1gO1xuICB9IGVsc2UgaWYgKGRlc3QuaHR0cEVuZHBvaW50KSB7XG4gICAgb3V0ID0gYHtvdGxwaHR0cDoge2VuZHBvaW50OiAke3lhbWxTdHJpbmcoZGVzdC5odHRwRW5kcG9pbnQpfWA7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVhY2hlZCB3aGVuIGEgZGVzdGluYXRpb24gY2FycmllcyBuZWl0aGVyIHRyYW5zcG9ydC4gRmFpbGluZyBoZXJlIGlzIHRoZSB3aG9sZSBwb2ludDogdGhlXG4gICAgLy8gYWx0ZXJuYXRpdmUgaXMgYSBjb2xsZWN0b3IgdGhhdCBleGl0cyBvbiBzdGFydHVwIHdoaWxlIHRoZSBmdW5jdGlvbiBpcyByZXBvcnRlZCBoZWFsdGh5LlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gaGFzIG5laXRoZXIgYGVuZHBvaW50YCAoT1RMUC9nUlBDKSBub3IgYGh0dHBFbmRwb2ludGAgKE9UTFAvSFRUUCksICcgK1xuICAgICAgICAnc28gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3Igd291bGQgaGF2ZSBub3doZXJlIHRvIGV4cG9ydC4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGAke291dH0ke3JlbmRlckhlYWRlcnMoZGVzdC5oZWFkZXJzKX19fWA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgcGlwZWxpbmUgb25seSBmb3IgdGhlIHNpZ25hbHMgdGhlIGRlc3RpbmF0aW9uIGFjY2VwdHMuIEEgc2lnbmFsIHdpdGggbm8gcGlwZWxpbmUgaXMgcmVmdXNlZCBhdFxuICogdGhlIHJlY2VpdmVyLCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIHdlIHdhbnQ6IHRoZSBTREsgaXMgdG9sZCBub3QgdG8gcHJvZHVjZSBpdCBlaXRoZXIgKHNlZVxuICogYGV4cG9ydGVyT3ZlcnJpZGVGb3JgKSwgYW5kIHRoZSB0d28gdG9nZXRoZXIgbWVhbiBhbiB1bmFjY2VwdGVkIHNpZ25hbCBpcyBuZXZlciBnZW5lcmF0ZWQsIG5ldmVyXG4gKiBleHBvcnRlZCwgYW5kIG5ldmVyIGEgcGVyLWJhdGNoIGVycm9yIGFnYWluc3QgYSBiYWNrZW5kIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGl0LlxuICovXG5mdW5jdGlvbiByZW5kZXJQaXBlbGluZXMoZGVzdDogT2RpZ29zRGVzdGluYXRpb24sIGV4cG9ydGVyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNpZ25hbHM6IEFycmF5PFtzdHJpbmcsIGJvb2xlYW5dPiA9IFtcbiAgICBbJ3RyYWNlcycsIHNpZ25hbEVuYWJsZWQoZGVzdC50cmFjZXMpXSxcbiAgICBbJ21ldHJpY3MnLCBzaWduYWxFbmFibGVkKGRlc3QubWV0cmljcyldLFxuICAgIFsnbG9ncycsIHNpZ25hbEVuYWJsZWQoZGVzdC5sb2dzKV0sXG4gIF07XG4gIGZvciAoY29uc3QgW25hbWUsIGVuYWJsZWRdIG9mIHNpZ25hbHMpIHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgYCR7bmFtZX06IHtyZWNlaXZlcnM6IFtvdGxwXSwgcHJvY2Vzc29yczogW21lbW9yeV9saW1pdGVyLCBiYXRjaCwgZGVjb3VwbGVdLCBleHBvcnRlcnM6IFske2V4cG9ydGVyTmFtZX1dfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAwID8gJycgOiBgeyR7cGFydHMuam9pbignLCAnKX19YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBhIHNpZ25hbCdzIGBPVEVMXypfRVhQT1JURVJgIG11c3QgaG9sZDogYG5vbmVgIHRvIHN1cHByZXNzIGEgc2lnbmFsIHRoZSBkZXN0aW5hdGlvblxuICogZG9lcyBub3QgYWNjZXB0LCBvciBgdW5kZWZpbmVkYCBtZWFuaW5nIHRoZSB2YXJpYWJsZSBtdXN0IGJlIEFCU0VOVCBiZWNhdXNlIHRoZSBTREsncyBvd24gZGVmYXVsdCBpc1xuICogYWxyZWFkeSB3aGF0IHdlIHdhbnQuXG4gKlxuICogT25seSB0aGUgXCJub25lXCIgc2lkZSBpcyB3cml0dGVuLCBiZWNhdXNlIGBvdGxwYCBpcyBhbHJlYWR5IGV2ZXJ5IE9wZW5UZWxlbWV0cnkgU0RLJ3MgZGVmYXVsdCBmb3IgYWxsXG4gKiB0aHJlZSBzaWduYWxzIOKAlCBzZXR0aW5nIGl0IHdvdWxkIHJlc3RhdGUgdGhlIGRlZmF1bHQgaW4gdGhyZWUgdmFyaWFibGVzIG9uIGV2ZXJ5IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0ZXJPdmVycmlkZUZvcihzdXBwb3J0ZWQ6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3VwcG9ydGVkID8gdW5kZWZpbmVkIDogRVhQT1JURVJfTk9ORTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21wbGV0ZSBjb2xsZWN0b3IgY29uZmlndXJhdGlvbiBmb3Igb25lIGRlc3RpbmF0aW9uLlxuICpcbiAqIEB0aHJvd3MgaWYgdGhlIGRlc3RpbmF0aW9uIG5hbWVzIG5laXRoZXIgdHJhbnNwb3J0LCBib3RoIHRyYW5zcG9ydHMsIG9yIG5vIHNpZ25hbHMgYXQgYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgaWYgKGRlc3QuZW5kcG9pbnQgJiYgZGVzdC5odHRwRW5kcG9pbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIHNldHMgYm90aCBgZW5kcG9pbnRgIChPVExQL2dSUEMpIGFuZCBgaHR0cEVuZHBvaW50YCAoT1RMUC9IVFRQKTsgJyArXG4gICAgICAgICd0aGV5IHNlbGVjdCBkaWZmZXJlbnQgY29sbGVjdG9yIGV4cG9ydGVycywgc28gZXhhY3RseSBvbmUgbXVzdCBiZSBzZXQuJyxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZXhwb3J0ZXIgPSByZW5kZXJFeHBvcnRlcihkZXN0KTtcbiAgY29uc3QgcGlwZWxpbmVzID0gcmVuZGVyUGlwZWxpbmVzKGRlc3QsIGV4cG9ydGVyTmFtZUZvcihkZXN0KSk7XG4gIGlmIChwaXBlbGluZXMgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ09kaWdvcyBkZXN0aW5hdGlvbiBhY2NlcHRzIG5vIHRlbGVtZXRyeSBzaWduYWxzICh0cmFjZXMsIG1ldHJpY3MgYW5kIGxvZ3MgYXJlIGFsbCBmYWxzZSksICcgK1xuICAgICAgICAnc28gdGhlIGNvbGxlY3RvciB3b3VsZCBoYXZlIG5vIHBpcGVsaW5lIHRvIGJ1aWxkIGFuZCB3b3VsZCBmYWlsIHRvIHN0YXJ0LicsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQ09MTEVDVE9SX0NPTkZJR19TQ0hFTUUgK1xuICAgICd7cmVjZWl2ZXJzOiB7b3RscDoge3Byb3RvY29sczogJyArXG4gICAgLy8gQm91bmQgdG8gbG9jYWxob3N0OiB0aGUgcmVjZWl2ZXIgZXhpc3RzIG9ubHkgZm9yIHRoZSBpbi1wcm9jZXNzIFNESy4gQmluZGluZyBpdCB3aWRlciB3b3VsZCBleHBvc2VcbiAgICAvLyBhbiB1bmF1dGhlbnRpY2F0ZWQgT1RMUCBlbmRwb2ludCBvbiB0aGUgc2FuZGJveCdzIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgICd7Z3JwYzoge2VuZHBvaW50OiBcImxvY2FsaG9zdDo0MzE3XCJ9LCBodHRwOiB7ZW5kcG9pbnQ6IFwibG9jYWxob3N0OjQzMThcIn19fX0sICcgK1xuICAgICdwcm9jZXNzb3JzOiAnICtcbiAgICBDT0xMRUNUT1JfUFJPQ0VTU09SUyArXG4gICAgJywgZXhwb3J0ZXJzOiAnICtcbiAgICBleHBvcnRlciArXG4gICAgJywgc2VydmljZToge3RlbGVtZXRyeToge21ldHJpY3M6IHtsZXZlbDogbm9uZX19LCBwaXBlbGluZXM6ICcgK1xuICAgIHBpcGVsaW5lcyArXG4gICAgJ319J1xuICApO1xufVxuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED FILE — DO NOT EDIT.
|
|
3
|
+
*
|
|
4
|
+
* Produced by cdk/scripts/generate-layers.ts from artifacts.json and manifest/layers.json.
|
|
5
|
+
* Run `npm run generate` (or `npm run build`) to refresh it.
|
|
6
|
+
*
|
|
7
|
+
* Odigos artifact version: (unreleased)
|
|
8
|
+
*/
|
|
9
|
+
/** Release this table was generated from. Empty before the first release. */
|
|
10
|
+
export declare const ODIGOS_VERSION = "";
|
|
11
|
+
/** SAR semantic version matching ODIGOS_VERSION (no leading "v"). */
|
|
12
|
+
export declare const SAR_SEMANTIC_VERSION = "";
|
|
13
|
+
/** Public layer ARNs, keyed "<region>/<language>/<architecture>". */
|
|
14
|
+
export declare const LAYER_ARNS: {
|
|
15
|
+
[key: string]: string;
|
|
16
|
+
};
|
|
17
|
+
/** SAR application ids, keyed "<language>/<architecture>". */
|
|
18
|
+
export declare const SAR_APPLICATIONS: {
|
|
19
|
+
[key: string]: string;
|
|
20
|
+
};
|
|
21
|
+
/** Loader configuration for web-server (Lambda Web Adapter) mode. */
|
|
22
|
+
export interface GeneratedWebServerLoader {
|
|
23
|
+
readonly envKey: string;
|
|
24
|
+
readonly separator: string;
|
|
25
|
+
readonly prepend: boolean;
|
|
26
|
+
readonly value: string;
|
|
27
|
+
readonly extraEnv: {
|
|
28
|
+
[key: string]: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Static per-language facts, mirrored from the connector's instrumentor. */
|
|
32
|
+
export interface GeneratedLanguageSpec {
|
|
33
|
+
readonly layerName: string;
|
|
34
|
+
readonly execWrapper: string;
|
|
35
|
+
readonly compatibleRuntimes: string[];
|
|
36
|
+
readonly handlerDistros?: {
|
|
37
|
+
[key: string]: string;
|
|
38
|
+
};
|
|
39
|
+
readonly webServer: GeneratedWebServerLoader | null;
|
|
40
|
+
}
|
|
41
|
+
export declare const LANGUAGES: {
|
|
42
|
+
[language: string]: GeneratedLanguageSpec;
|
|
43
|
+
};
|
|
44
|
+
/** Architectures every language is built for. */
|
|
45
|
+
export declare const ARCHITECTURES: string[];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/**
|
|
4
|
+
* GENERATED FILE — DO NOT EDIT.
|
|
5
|
+
*
|
|
6
|
+
* Produced by cdk/scripts/generate-layers.ts from artifacts.json and manifest/layers.json.
|
|
7
|
+
* Run `npm run generate` (or `npm run build`) to refresh it.
|
|
8
|
+
*
|
|
9
|
+
* Odigos artifact version: (unreleased)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ARCHITECTURES = exports.LANGUAGES = exports.SAR_APPLICATIONS = exports.LAYER_ARNS = exports.SAR_SEMANTIC_VERSION = exports.ODIGOS_VERSION = void 0;
|
|
13
|
+
/** Release this table was generated from. Empty before the first release. */
|
|
14
|
+
exports.ODIGOS_VERSION = "";
|
|
15
|
+
/** SAR semantic version matching ODIGOS_VERSION (no leading "v"). */
|
|
16
|
+
exports.SAR_SEMANTIC_VERSION = "";
|
|
17
|
+
/** Public layer ARNs, keyed "<region>/<language>/<architecture>". */
|
|
18
|
+
exports.LAYER_ARNS = {};
|
|
19
|
+
/** SAR application ids, keyed "<language>/<architecture>". */
|
|
20
|
+
exports.SAR_APPLICATIONS = {};
|
|
21
|
+
exports.LANGUAGES = {
|
|
22
|
+
"python": {
|
|
23
|
+
"layerName": "odigos-otel-python",
|
|
24
|
+
"execWrapper": "/opt/otel-instrument",
|
|
25
|
+
"compatibleRuntimes": [
|
|
26
|
+
"python3.9",
|
|
27
|
+
"python3.10",
|
|
28
|
+
"python3.11",
|
|
29
|
+
"python3.12",
|
|
30
|
+
"python3.13",
|
|
31
|
+
"python3.14"
|
|
32
|
+
],
|
|
33
|
+
"webServer": {
|
|
34
|
+
"envKey": "PYTHONPATH",
|
|
35
|
+
"separator": ":",
|
|
36
|
+
"prepend": true,
|
|
37
|
+
"value": "/opt/python:/opt/python/opentelemetry/instrumentation/auto_instrumentation:/var/task:/var/task/site-packages",
|
|
38
|
+
"extraEnv": {
|
|
39
|
+
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"nodejs": {
|
|
44
|
+
"layerName": "odigos-otel-nodejs",
|
|
45
|
+
"execWrapper": "/opt/otel-handler",
|
|
46
|
+
"compatibleRuntimes": [
|
|
47
|
+
"nodejs18.x",
|
|
48
|
+
"nodejs20.x",
|
|
49
|
+
"nodejs22.x",
|
|
50
|
+
"nodejs24.x"
|
|
51
|
+
],
|
|
52
|
+
"webServer": {
|
|
53
|
+
"envKey": "NODE_OPTIONS",
|
|
54
|
+
"separator": " ",
|
|
55
|
+
"prepend": false,
|
|
56
|
+
"value": "--import /opt/init.mjs",
|
|
57
|
+
"extraEnv": {}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"java": {
|
|
61
|
+
"layerName": "odigos-otel-java",
|
|
62
|
+
"execWrapper": "/opt/otel-handler",
|
|
63
|
+
"compatibleRuntimes": [
|
|
64
|
+
"java8.al2",
|
|
65
|
+
"java11",
|
|
66
|
+
"java17",
|
|
67
|
+
"java21",
|
|
68
|
+
"java25"
|
|
69
|
+
],
|
|
70
|
+
"handlerDistros": {
|
|
71
|
+
"otel-handler": "/opt/otel-handler",
|
|
72
|
+
"otel-proxy-handler": "/opt/otel-proxy-handler",
|
|
73
|
+
"otel-sqs-handler": "/opt/otel-sqs-handler",
|
|
74
|
+
"otel-stream-handler": "/opt/otel-stream-handler"
|
|
75
|
+
},
|
|
76
|
+
"webServer": {
|
|
77
|
+
"envKey": "JAVA_TOOL_OPTIONS",
|
|
78
|
+
"separator": " ",
|
|
79
|
+
"prepend": false,
|
|
80
|
+
"value": "-javaagent:/opt/opentelemetry-javaagent.jar",
|
|
81
|
+
"extraEnv": {}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"ruby": {
|
|
85
|
+
"layerName": "odigos-otel-ruby",
|
|
86
|
+
"execWrapper": "/opt/otel-handler",
|
|
87
|
+
"compatibleRuntimes": [
|
|
88
|
+
"ruby3.2",
|
|
89
|
+
"ruby3.3",
|
|
90
|
+
"ruby3.4",
|
|
91
|
+
"ruby4.0"
|
|
92
|
+
],
|
|
93
|
+
"webServer": null
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/** Architectures every language is built for. */
|
|
97
|
+
exports.ARCHITECTURES = [
|
|
98
|
+
"x86_64",
|
|
99
|
+
"arm64"
|
|
100
|
+
];
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlbmVyYXRlZC9sYXllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQjs7Ozs7OztHQU9HOzs7QUFFSCw2RUFBNkU7QUFDaEUsUUFBQSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRWpDLHFFQUFxRTtBQUN4RCxRQUFBLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2QyxxRUFBcUU7QUFDeEQsUUFBQSxVQUFVLEdBQThCLEVBQUUsQ0FBQztBQUV4RCw4REFBOEQ7QUFDakQsUUFBQSxnQkFBZ0IsR0FBOEIsRUFBRSxDQUFDO0FBb0JqRCxRQUFBLFNBQVMsR0FBa0Q7SUFDdEUsUUFBUSxFQUFFO1FBQ1IsV0FBVyxFQUFFLG9CQUFvQjtRQUNqQyxhQUFhLEVBQUUsc0JBQXNCO1FBQ3JDLG9CQUFvQixFQUFFO1lBQ3BCLFdBQVc7WUFDWCxZQUFZO1lBQ1osWUFBWTtZQUNaLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtTQUNiO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsUUFBUSxFQUFFLFlBQVk7WUFDdEIsV0FBVyxFQUFFLEdBQUc7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsOEdBQThHO1lBQ3ZILFVBQVUsRUFBRTtnQkFDViw2QkFBNkIsRUFBRSxlQUFlO2FBQy9DO1NBQ0Y7S0FDRjtJQUNELFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxvQkFBb0I7UUFDakMsYUFBYSxFQUFFLG1CQUFtQjtRQUNsQyxvQkFBb0IsRUFBRTtZQUNwQixZQUFZO1lBQ1osWUFBWTtZQUNaLFlBQVk7WUFDWixZQUFZO1NBQ2I7UUFDRCxXQUFXLEVBQUU7WUFDWCxRQUFRLEVBQUUsY0FBYztZQUN4QixXQUFXLEVBQUUsR0FBRztZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLFVBQVUsRUFBRSxFQUFFO1NBQ2Y7S0FDRjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSxrQkFBa0I7UUFDL0IsYUFBYSxFQUFFLG1CQUFtQjtRQUNsQyxvQkFBb0IsRUFBRTtZQUNwQixXQUFXO1lBQ1gsUUFBUTtZQUNSLFFBQVE7WUFDUixRQUFRO1lBQ1IsUUFBUTtTQUNUO1FBQ0QsZ0JBQWdCLEVBQUU7WUFDaEIsY0FBYyxFQUFFLG1CQUFtQjtZQUNuQyxvQkFBb0IsRUFBRSx5QkFBeUI7WUFDL0Msa0JBQWtCLEVBQUUsdUJBQXVCO1lBQzNDLHFCQUFxQixFQUFFLDBCQUEwQjtTQUNsRDtRQUNELFdBQVcsRUFBRTtZQUNYLFFBQVEsRUFBRSxtQkFBbUI7WUFDN0IsV0FBVyxFQUFFLEdBQUc7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsT0FBTyxFQUFFLDZDQUE2QztZQUN0RCxVQUFVLEVBQUUsRUFBRTtTQUNmO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixXQUFXLEVBQUUsa0JBQWtCO1FBQy9CLGFBQWEsRUFBRSxtQkFBbUI7UUFDbEMsb0JBQW9CLEVBQUU7WUFDcEIsU0FBUztZQUNULFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztTQUNWO1FBQ0QsV0FBVyxFQUFFLElBQUk7S0FDbEI7Q0FDRixDQUFDO0FBRUYsaURBQWlEO0FBQ3BDLFFBQUEsYUFBYSxHQUFhO0lBQ3JDLFFBQVE7SUFDUixPQUFPO0NBQ1IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIEdFTkVSQVRFRCBGSUxFIOKAlCBETyBOT1QgRURJVC5cbiAqXG4gKiBQcm9kdWNlZCBieSBjZGsvc2NyaXB0cy9nZW5lcmF0ZS1sYXllcnMudHMgZnJvbSBhcnRpZmFjdHMuanNvbiBhbmQgbWFuaWZlc3QvbGF5ZXJzLmpzb24uXG4gKiBSdW4gYG5wbSBydW4gZ2VuZXJhdGVgIChvciBgbnBtIHJ1biBidWlsZGApIHRvIHJlZnJlc2ggaXQuXG4gKlxuICogT2RpZ29zIGFydGlmYWN0IHZlcnNpb246ICh1bnJlbGVhc2VkKVxuICovXG5cbi8qKiBSZWxlYXNlIHRoaXMgdGFibGUgd2FzIGdlbmVyYXRlZCBmcm9tLiBFbXB0eSBiZWZvcmUgdGhlIGZpcnN0IHJlbGVhc2UuICovXG5leHBvcnQgY29uc3QgT0RJR09TX1ZFUlNJT04gPSBcIlwiO1xuXG4vKiogU0FSIHNlbWFudGljIHZlcnNpb24gbWF0Y2hpbmcgT0RJR09TX1ZFUlNJT04gKG5vIGxlYWRpbmcgXCJ2XCIpLiAqL1xuZXhwb3J0IGNvbnN0IFNBUl9TRU1BTlRJQ19WRVJTSU9OID0gXCJcIjtcblxuLyoqIFB1YmxpYyBsYXllciBBUk5zLCBrZXllZCBcIjxyZWdpb24+LzxsYW5ndWFnZT4vPGFyY2hpdGVjdHVyZT5cIi4gKi9cbmV4cG9ydCBjb25zdCBMQVlFUl9BUk5TOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbi8qKiBTQVIgYXBwbGljYXRpb24gaWRzLCBrZXllZCBcIjxsYW5ndWFnZT4vPGFyY2hpdGVjdHVyZT5cIi4gKi9cbmV4cG9ydCBjb25zdCBTQVJfQVBQTElDQVRJT05TOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbi8qKiBMb2FkZXIgY29uZmlndXJhdGlvbiBmb3Igd2ViLXNlcnZlciAoTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRXZWJTZXJ2ZXJMb2FkZXIge1xuICByZWFkb25seSBlbnZLZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VwYXJhdG9yOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZXBlbmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4dHJhRW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKiogU3RhdGljIHBlci1sYW5ndWFnZSBmYWN0cywgbWlycm9yZWQgZnJvbSB0aGUgY29ubmVjdG9yJ3MgaW5zdHJ1bWVudG9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRMYW5ndWFnZVNwZWMge1xuICByZWFkb25seSBsYXllck5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZXhlY1dyYXBwZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29tcGF0aWJsZVJ1bnRpbWVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaGFuZGxlckRpc3Ryb3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSB3ZWJTZXJ2ZXI6IEdlbmVyYXRlZFdlYlNlcnZlckxvYWRlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCBMQU5HVUFHRVM6IHsgW2xhbmd1YWdlOiBzdHJpbmddOiBHZW5lcmF0ZWRMYW5ndWFnZVNwZWMgfSA9IHtcbiAgXCJweXRob25cIjoge1xuICAgIFwibGF5ZXJOYW1lXCI6IFwib2RpZ29zLW90ZWwtcHl0aG9uXCIsXG4gICAgXCJleGVjV3JhcHBlclwiOiBcIi9vcHQvb3RlbC1pbnN0cnVtZW50XCIsXG4gICAgXCJjb21wYXRpYmxlUnVudGltZXNcIjogW1xuICAgICAgXCJweXRob24zLjlcIixcbiAgICAgIFwicHl0aG9uMy4xMFwiLFxuICAgICAgXCJweXRob24zLjExXCIsXG4gICAgICBcInB5dGhvbjMuMTJcIixcbiAgICAgIFwicHl0aG9uMy4xM1wiLFxuICAgICAgXCJweXRob24zLjE0XCJcbiAgICBdLFxuICAgIFwid2ViU2VydmVyXCI6IHtcbiAgICAgIFwiZW52S2V5XCI6IFwiUFlUSE9OUEFUSFwiLFxuICAgICAgXCJzZXBhcmF0b3JcIjogXCI6XCIsXG4gICAgICBcInByZXBlbmRcIjogdHJ1ZSxcbiAgICAgIFwidmFsdWVcIjogXCIvb3B0L3B5dGhvbjovb3B0L3B5dGhvbi9vcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi9hdXRvX2luc3RydW1lbnRhdGlvbjovdmFyL3Rhc2s6L3Zhci90YXNrL3NpdGUtcGFja2FnZXNcIixcbiAgICAgIFwiZXh0cmFFbnZcIjoge1xuICAgICAgICBcIk9URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTFwiOiBcImh0dHAvcHJvdG9idWZcIlxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgXCJub2RlanNcIjoge1xuICAgIFwibGF5ZXJOYW1lXCI6IFwib2RpZ29zLW90ZWwtbm9kZWpzXCIsXG4gICAgXCJleGVjV3JhcHBlclwiOiBcIi9vcHQvb3RlbC1oYW5kbGVyXCIsXG4gICAgXCJjb21wYXRpYmxlUnVudGltZXNcIjogW1xuICAgICAgXCJub2RlanMxOC54XCIsXG4gICAgICBcIm5vZGVqczIwLnhcIixcbiAgICAgIFwibm9kZWpzMjIueFwiLFxuICAgICAgXCJub2RlanMyNC54XCJcbiAgICBdLFxuICAgIFwid2ViU2VydmVyXCI6IHtcbiAgICAgIFwiZW52S2V5XCI6IFwiTk9ERV9PUFRJT05TXCIsXG4gICAgICBcInNlcGFyYXRvclwiOiBcIiBcIixcbiAgICAgIFwicHJlcGVuZFwiOiBmYWxzZSxcbiAgICAgIFwidmFsdWVcIjogXCItLWltcG9ydCAvb3B0L2luaXQubWpzXCIsXG4gICAgICBcImV4dHJhRW52XCI6IHt9XG4gICAgfVxuICB9LFxuICBcImphdmFcIjoge1xuICAgIFwibGF5ZXJOYW1lXCI6IFwib2RpZ29zLW90ZWwtamF2YVwiLFxuICAgIFwiZXhlY1dyYXBwZXJcIjogXCIvb3B0L290ZWwtaGFuZGxlclwiLFxuICAgIFwiY29tcGF0aWJsZVJ1bnRpbWVzXCI6IFtcbiAgICAgIFwiamF2YTguYWwyXCIsXG4gICAgICBcImphdmExMVwiLFxuICAgICAgXCJqYXZhMTdcIixcbiAgICAgIFwiamF2YTIxXCIsXG4gICAgICBcImphdmEyNVwiXG4gICAgXSxcbiAgICBcImhhbmRsZXJEaXN0cm9zXCI6IHtcbiAgICAgIFwib3RlbC1oYW5kbGVyXCI6IFwiL29wdC9vdGVsLWhhbmRsZXJcIixcbiAgICAgIFwib3RlbC1wcm94eS1oYW5kbGVyXCI6IFwiL29wdC9vdGVsLXByb3h5LWhhbmRsZXJcIixcbiAgICAgIFwib3RlbC1zcXMtaGFuZGxlclwiOiBcIi9vcHQvb3RlbC1zcXMtaGFuZGxlclwiLFxuICAgICAgXCJvdGVsLXN0cmVhbS1oYW5kbGVyXCI6IFwiL29wdC9vdGVsLXN0cmVhbS1oYW5kbGVyXCJcbiAgICB9LFxuICAgIFwid2ViU2VydmVyXCI6IHtcbiAgICAgIFwiZW52S2V5XCI6IFwiSkFWQV9UT09MX09QVElPTlNcIixcbiAgICAgIFwic2VwYXJhdG9yXCI6IFwiIFwiLFxuICAgICAgXCJwcmVwZW5kXCI6IGZhbHNlLFxuICAgICAgXCJ2YWx1ZVwiOiBcIi1qYXZhYWdlbnQ6L29wdC9vcGVudGVsZW1ldHJ5LWphdmFhZ2VudC5qYXJcIixcbiAgICAgIFwiZXh0cmFFbnZcIjoge31cbiAgICB9XG4gIH0sXG4gIFwicnVieVwiOiB7XG4gICAgXCJsYXllck5hbWVcIjogXCJvZGlnb3Mtb3RlbC1ydWJ5XCIsXG4gICAgXCJleGVjV3JhcHBlclwiOiBcIi9vcHQvb3RlbC1oYW5kbGVyXCIsXG4gICAgXCJjb21wYXRpYmxlUnVudGltZXNcIjogW1xuICAgICAgXCJydWJ5My4yXCIsXG4gICAgICBcInJ1YnkzLjNcIixcbiAgICAgIFwicnVieTMuNFwiLFxuICAgICAgXCJydWJ5NC4wXCJcbiAgICBdLFxuICAgIFwid2ViU2VydmVyXCI6IG51bGxcbiAgfVxufTtcblxuLyoqIEFyY2hpdGVjdHVyZXMgZXZlcnkgbGFuZ3VhZ2UgaXMgYnVpbHQgZm9yLiAqL1xuZXhwb3J0IGNvbnN0IEFSQ0hJVEVDVFVSRVM6IHN0cmluZ1tdID0gW1xuICBcIng4Nl82NFwiLFxuICBcImFybTY0XCJcbl07XG4iXX0=
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './instrumentation';
|
|
3
|
+
export { odigosLayerName } from './layer-resolver';
|
|
4
|
+
export { languageFromRuntime, execWrapperFor, layerNameFor } from './runtime';
|
|
5
|
+
export { renderCollectorConfig, ENV_COLLECTOR_CONFIG_URI, ENV_TRACES_EXPORTER, ENV_METRICS_EXPORTER, ENV_LOGS_EXPORTER, } from './collector-config';
|
|
6
|
+
export { ODIGOS_VERSION, LAYER_ARNS, SAR_APPLICATIONS, SAR_SEMANTIC_VERSION } from './generated/layers';
|