Skip to content

Commit 37c1306

Browse files
authored
Add Application Signals logs pipeline translator and allow metric routing to otlp endpoint (#2111)
1 parent 92c3613 commit 37c1306

41 files changed

Lines changed: 3839 additions & 164 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

go.mod

Lines changed: 45 additions & 37 deletions
Large diffs are not rendered by default.

go.sum

Lines changed: 70 additions & 64 deletions
Large diffs are not rendered by default.

service/defaultcomponents/components.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@
44
package defaultcomponents
55

66
import (
7+
"github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector"
78
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter"
89
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter"
910
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter"
1011
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusremotewriteexporter"
1112
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension"
1213
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy"
14+
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension"
1315
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension"
1416
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver"
1517
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension"
1618
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension"
1719
"github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage"
1820
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor"
21+
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributestocontextprocessor"
1922
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/awsattributelimitprocessor"
2023
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor"
2124
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor"
@@ -52,6 +55,7 @@ import (
5255
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/tcplogreceiver"
5356
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/udplogreceiver"
5457
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver"
58+
"go.opentelemetry.io/collector/connector"
5559
"go.opentelemetry.io/collector/exporter"
5660
"go.opentelemetry.io/collector/exporter/debugexporter"
5761
"go.opentelemetry.io/collector/exporter/nopexporter"
@@ -117,6 +121,7 @@ func Factories() (otelcol.Factories, error) {
117121

118122
if factories.Processors, err = otelcol.MakeFactoryMap[processor.Factory](
119123
attributesprocessor.NewFactory(),
124+
attributestocontextprocessor.NewFactory(),
120125
awsapplicationsignals.NewFactory(),
121126
awsattributelimitprocessor.NewFactory(),
122127
awsentity.NewFactory(),
@@ -166,6 +171,7 @@ func Factories() (otelcol.Factories, error) {
166171
agenthealth.NewFactory(),
167172
awscloudwatchlogsprovisionerextension.NewFactory(),
168173
awsproxy.NewFactory(),
174+
headerssetterextension.NewFactory(),
169175
entitystore.NewFactory(),
170176
k8smetadata.NewFactory(),
171177
nodemetadatacache.NewFactory(),
@@ -180,5 +186,11 @@ func Factories() (otelcol.Factories, error) {
180186
return otelcol.Factories{}, err
181187
}
182188

189+
if factories.Connectors, err = otelcol.MakeFactoryMap[connector.Factory](
190+
routingconnector.NewFactory(),
191+
); err != nil {
192+
return otelcol.Factories{}, err
193+
}
194+
183195
return factories, nil
184196
}

service/defaultcomponents/components_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func TestComponents(t *testing.T) {
4848

4949
wantProcessors := []string{
5050
"attributes",
51+
"attributestocontext",
5152
"awsapplicationsignals",
5253
"awsattributelimit",
5354
"awsdevicepodcorrelation",
@@ -99,13 +100,23 @@ func TestComponents(t *testing.T) {
99100
assert.Contains(t, gotExporters, typeStr)
100101
}
101102

103+
wantConnectors := []string{
104+
"routing",
105+
}
106+
gotConnectors := collections.MapSlice(maps.Keys(factories.Connectors), component.Type.String)
107+
assert.Equal(t, len(wantConnectors), len(gotConnectors))
108+
for _, typeStr := range wantConnectors {
109+
assert.Contains(t, gotConnectors, typeStr)
110+
}
111+
102112
wantExtensions := []string{
103113
"agenthealth",
104114
"awscloudwatchlogsprovisioner",
105115
"awsproxy",
106116
"ecs_observer",
107117
"entitystore",
108118
"file_storage",
119+
"headers_setter",
109120
"health_check",
110121
"k8smetadata",
111122
"nodemetadatacache",

translator/config/schema.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,25 @@
658658
},
659659
"windows_events": {
660660
"$ref": "#/definitions/logsDefinition/definitions/logsWindowsEventsDefinition"
661+
},
662+
"application_signals": {
663+
"type": "object",
664+
"properties": {
665+
"log_group_name": {
666+
"type": "string",
667+
"minLength": 1,
668+
"maxLength": 512
669+
},
670+
"log_stream_name": {
671+
"type": "string",
672+
"minLength": 1,
673+
"maxLength": 512
674+
},
675+
"disabled": {
676+
"type": "boolean"
677+
}
678+
},
679+
"additionalProperties": true
661680
}
662681
},
663682
"minProperties": 1,

translator/tocwconfig/sampleConfig/appsignals_and_ecs_config.yaml

Lines changed: 180 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
1+
connectors:
2+
routing/application_signals_logs:
3+
default_pipelines:
4+
- logs/application_signals_logs_batch
5+
error_mode: ignore
6+
table:
7+
- condition: attributes["event.name"] == "aws.service_events.aggregate_profile"
8+
context: log
9+
pipelines:
10+
- logs/application_signals_logs_nobatch
11+
statement: ""
12+
routing/application_signals_metrics:
13+
default_pipelines:
14+
- metrics/application_signals_metrics_logs_destination
15+
error_mode: ignore
16+
table:
17+
- condition: attributes["Telemetry.Source"] == "ServiceEvents"
18+
context: datapoint
19+
pipelines:
20+
- metrics/application_signals_metrics_otlp_destination
21+
statement: ""
122
exporters:
223
awsemf/application_signals:
324
add_entity: false
@@ -159,6 +180,60 @@ exporters:
159180
telemetry:
160181
enabled: true
161182
include_metadata: true
183+
otlphttp/application_signals_logs:
184+
auth:
185+
authenticator: headers_setter/application_signals_logs
186+
compression: gzip
187+
encoding: proto
188+
idle_conn_timeout: 1m30s
189+
logs_endpoint: https://logs.us-east-1.amazonaws.com/v1/logs
190+
max_idle_conns: 100
191+
metrics_endpoint: ""
192+
retry_on_failure:
193+
enabled: true
194+
initial_interval: 5s
195+
max_elapsed_time: 5m0s
196+
max_interval: 30s
197+
multiplier: 1.5
198+
randomization_factor: 0.5
199+
sending_queue:
200+
block_on_overflow: false
201+
blocking: false
202+
enabled: true
203+
num_consumers: 10
204+
queue_size: 1000
205+
sizer: {}
206+
wait_for_result: false
207+
timeout: 30s
208+
traces_endpoint: ""
209+
write_buffer_size: 524288
210+
otlphttp/application_signals_metrics_otlp_destination:
211+
auth:
212+
authenticator: sigv4auth/monitoring
213+
compression: gzip
214+
encoding: proto
215+
idle_conn_timeout: 1m30s
216+
logs_endpoint: ""
217+
max_idle_conns: 100
218+
metrics_endpoint: https://monitoring.us-east-1.amazonaws.com/v1/metrics
219+
retry_on_failure:
220+
enabled: true
221+
initial_interval: 5s
222+
max_elapsed_time: 5m0s
223+
max_interval: 30s
224+
multiplier: 1.5
225+
randomization_factor: 0.5
226+
sending_queue:
227+
block_on_overflow: false
228+
blocking: false
229+
enabled: true
230+
num_consumers: 10
231+
queue_size: 1000
232+
sizer: {}
233+
wait_for_result: false
234+
timeout: 30s
235+
traces_endpoint: ""
236+
write_buffer_size: 524288
162237
extensions:
163238
agenthealth/logs:
164239
is_usage_data_enabled: true
@@ -183,6 +258,11 @@ extensions:
183258
usage_flags:
184259
mode: EC2
185260
region_type: ACJ
261+
awscloudwatchlogsprovisioner:
262+
additional_auth: sigv4auth/logs
263+
logs_provision_failure_backoff: 30s
264+
logs_provision_timeout: 10s
265+
region: us-east-1
186266
awsproxy/application_signals:
187267
additional_routing_rules:
188268
- aws_endpoint: https://application-signals.us-east-1.api.aws
@@ -202,7 +282,30 @@ extensions:
202282
region: us-east-1
203283
role_arn: ""
204284
service_name: ""
285+
headers_setter/application_signals_logs:
286+
additional_auth: awscloudwatchlogsprovisioner
287+
headers:
288+
- action: upsert
289+
from_context: aws.log.group.name
290+
key: x-aws-log-group
291+
- action: upsert
292+
key: x-aws-log-stream
293+
value: default
294+
sigv4auth/logs:
295+
assume_role:
296+
sts_region: us-east-1
297+
region: us-east-1
298+
service: logs
299+
sigv4auth/monitoring:
300+
assume_role:
301+
sts_region: us-east-1
302+
region: us-east-1
303+
service: monitoring
205304
processors:
305+
attributestocontext:
306+
actions:
307+
- from_resource_attribute: aws.log.group.name
308+
key: aws.log.group.name
206309
awsapplicationsignals:
207310
limiter:
208311
disabled: false
@@ -213,6 +316,18 @@ processors:
213316
resolvers:
214317
- name: ""
215318
platform: ecs
319+
batch/application_signals_logs:
320+
metadata_cardinality_limit: 1000
321+
metadata_keys:
322+
- aws.log.group.name
323+
send_batch_max_size: 0
324+
send_batch_size: 8192
325+
timeout: 5s
326+
batch/application_signals_metrics_otlp_destination:
327+
metadata_cardinality_limit: 1000
328+
send_batch_max_size: 0
329+
send_batch_size: 8192
330+
timeout: 1m0s
216331
metricstransform/application_signals:
217332
transforms:
218333
- action: update
@@ -1327,6 +1442,30 @@ processors:
13271442
os.version:
13281443
enabled: false
13291444
timeout: 2s
1445+
transform/application_signals_logs:
1446+
error_mode: propagate
1447+
flatten_data: false
1448+
log_statements:
1449+
- context: resource
1450+
error_mode: propagate
1451+
statements:
1452+
- set(resource.attributes["temporary_key.service.name"], resource.attributes["service.name"])
1453+
- set(resource.attributes["temporary_key.service.name"], "unknown_service") where resource.attributes["temporary_key.service.name"] == nil
1454+
- replace_pattern(resource.attributes["temporary_key.service.name"], "^unknown_service:.*", "unknown_service")
1455+
- set(resource.attributes["aws.log.group.name"], Concat(["/aws/service-events/", resource.attributes["temporary_key.service.name"]], ""))
1456+
metric_statements: []
1457+
trace_statements: []
1458+
transform/application_signals_logs_cleanup:
1459+
error_mode: propagate
1460+
flatten_data: false
1461+
log_statements:
1462+
- context: resource
1463+
error_mode: propagate
1464+
statements:
1465+
- delete_key(resource.attributes, "aws.log.group.name")
1466+
- delete_key(resource.attributes, "temporary_key.service.name")
1467+
metric_statements: []
1468+
trace_statements: []
13301469
receivers:
13311470
otlp/grpc_0_0_0_0_4315:
13321471
protocols:
@@ -1360,14 +1499,54 @@ service:
13601499
- agenthealth/traces
13611500
- agenthealth/statuscode
13621501
- agenthealth/logs
1502+
- sigv4auth/monitoring
1503+
- headers_setter/application_signals_logs
1504+
- sigv4auth/logs
1505+
- awscloudwatchlogsprovisioner
13631506
pipelines:
1364-
metrics/application_signals:
1507+
logs/application_signals_logs_batch:
1508+
exporters:
1509+
- otlphttp/application_signals_logs
1510+
processors:
1511+
- batch/application_signals_logs
1512+
receivers:
1513+
- routing/application_signals_logs
1514+
logs/application_signals_logs_nobatch:
1515+
exporters:
1516+
- otlphttp/application_signals_logs
1517+
processors: []
1518+
receivers:
1519+
- routing/application_signals_logs
1520+
logs/application_signals_logs_route:
1521+
exporters:
1522+
- routing/application_signals_logs
1523+
processors:
1524+
- transform/application_signals_logs
1525+
- attributestocontext
1526+
- transform/application_signals_logs_cleanup
1527+
receivers:
1528+
- otlp/grpc_0_0_0_0_4315
1529+
- otlp/http_0_0_0_0_4316
1530+
metrics/application_signals_metrics_logs_destination:
13651531
exporters:
13661532
- awsemf/application_signals
13671533
processors:
13681534
- metricstransform/application_signals
13691535
- resourcedetection
13701536
- awsapplicationsignals
1537+
receivers:
1538+
- routing/application_signals_metrics
1539+
metrics/application_signals_metrics_otlp_destination:
1540+
exporters:
1541+
- otlphttp/application_signals_metrics_otlp_destination
1542+
processors:
1543+
- batch/application_signals_metrics_otlp_destination
1544+
receivers:
1545+
- routing/application_signals_metrics
1546+
metrics/application_signals_metrics_route:
1547+
exporters:
1548+
- routing/application_signals_metrics
1549+
processors: []
13711550
receivers:
13721551
- otlp/grpc_0_0_0_0_4315
13731552
- otlp/http_0_0_0_0_4316

0 commit comments

Comments
 (0)