Skip to content

Commit ee3d344

Browse files
Paramadonagarakan
authored andcommitted
Fixing prometheus env configuration expansion problem (#1768)
1 parent 3c4a802 commit ee3d344

File tree

7 files changed

+438
-1
lines changed

7 files changed

+438
-1
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
global:
2+
scrape_interval: 5s
3+
scrape_timeout: 5s
4+
scrape_configs:
5+
- job_name: 'prometheus_test_job'
6+
static_configs:
7+
- targets: ['localhost:8101']
8+
metric_relabel_configs:
9+
- source_labels: ['__name__']
10+
target_label: 'my_name'
11+
action: replace
12+
regex: '(.*)'
13+
replacement: $1
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
[agent]
2+
collection_jitter = "0s"
3+
debug = false
4+
flush_interval = "1s"
5+
flush_jitter = "0s"
6+
hostname = "host_name_from_env"
7+
interval = "60s"
8+
logfile = ""
9+
logtarget = "lumberjack"
10+
metric_batch_size = 1000
11+
metric_buffer_limit = 10000
12+
omit_hostname = false
13+
precision = ""
14+
quiet = false
15+
round_interval = false
16+
17+
[outputs]
18+
19+
[[outputs.cloudwatchlogs]]
20+
endpoint_override = "https://fake_endpoint"
21+
force_flush_interval = "30s"
22+
log_stream_name = "host_name_from_env"
23+
mode = "EC2"
24+
region = "us-east-1"
25+
region_type = "ACJ"
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
{
2+
"agent": {
3+
"region": "us-east-1"
4+
},
5+
"logs": {
6+
"metrics_collected": {
7+
"prometheus": {
8+
"cluster_name": "TestCluster",
9+
"log_group_name": "/aws/ecs/containerinsights/TestCluster/prometheus",
10+
"prometheus_config_path": "{prometheusFileName}",
11+
"ecs_service_discovery": {
12+
"docker_label": {
13+
"sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME_1",
14+
"sd_metrics_path_label": "ECS_PROMETHEUS_METRICS_PATH",
15+
"sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET"
16+
},
17+
"task_definition_list": [
18+
{
19+
"sd_job_name": "task_def_1",
20+
"sd_metrics_path": "/stats/metrics",
21+
"sd_metrics_ports": "9901",
22+
"sd_task_definition_arn_pattern": ".*task_def_1:[0-9]+"
23+
},
24+
{
25+
"sd_container_name_pattern": "^envoy$",
26+
"sd_metrics_ports": "9902",
27+
"sd_task_definition_arn_pattern": "task_def_2"
28+
}
29+
],
30+
"service_name_list_for_tasks": [
31+
{
32+
"sd_job_name": "service_name_1",
33+
"sd_metrics_path": "/metrics",
34+
"sd_metrics_ports": "9113",
35+
"sd_service_name_pattern": ".*-application-stack",
36+
"sd_container_name_pattern": "nginx-prometheus-exporter"
37+
},
38+
{
39+
"sd_metrics_path":"/stats/metrics",
40+
"sd_metrics_ports": "9114",
41+
"sd_service_name_pattern": "run-application-stack"
42+
}
43+
],
44+
"sd_cluster_region": "us-west-1",
45+
"sd_frequency": "1m",
46+
"sd_result_file": "{ecsSdFileName}",
47+
"sd_target_cluster": "ecs-cluster-a"
48+
},
49+
"emf_processor": {
50+
"metric_declaration_dedup": true,
51+
"metric_namespace": "CustomizedNamespace",
52+
"metric_unit": {
53+
"nginx_request_count": "Count"
54+
},
55+
"metric_declaration": [
56+
{
57+
"dimensions": [["Service"]],
58+
"label_matcher": "nginx.*",
59+
"label_separator": ";",
60+
"metric_selectors": ["^nginx_request_count$"],
61+
"source_labels": ["Service"]
62+
},
63+
{
64+
"label_matcher": "default",
65+
"metric_selectors": [".*"],
66+
"source_labels": ["Namespace"]
67+
},
68+
{
69+
"source_labels":["name"],
70+
"dimensions":[
71+
["name"]
72+
],
73+
"metric_selectors": ["^.*$"]
74+
},
75+
{
76+
"source_labels":["name"],
77+
"dimensions":[
78+
["name"]
79+
],
80+
"metric_selectors": ["^node_cpu_guest_seconds_total$"]
81+
}
82+
]
83+
}
84+
}
85+
},
86+
"force_flush_interval": 30,
87+
"endpoint_override":"https://fake_endpoint"
88+
}
89+
}
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
exporters:
2+
awsemf/prometheus:
3+
add_entity: false
4+
certificate_file_path: ""
5+
detailed_metrics: true
6+
dimension_rollup_option: NoDimensionRollup
7+
disable_metric_extraction: false
8+
eks_fargate_container_insights_enabled: false
9+
endpoint: https://fake_endpoint
10+
enhanced_container_insights: false
11+
external_id: ""
12+
imds_retries: 1
13+
local_mode: false
14+
log_group_name: /aws/ecs/containerinsights/TestCluster/prometheus
15+
log_retention: 0
16+
log_stream_name: '{JobName}'
17+
max_retries: 2
18+
metric_declarations:
19+
- dimensions:
20+
- - Service
21+
label_matchers:
22+
- label_names:
23+
- Service
24+
regex: nginx.*
25+
separator: ;
26+
metric_name_selectors:
27+
- ^nginx_request_count$
28+
- dimensions: []
29+
label_matchers:
30+
- label_names:
31+
- Namespace
32+
regex: default
33+
separator: ;
34+
metric_name_selectors:
35+
- .*
36+
- dimensions:
37+
- - name
38+
label_matchers:
39+
- label_names:
40+
- name
41+
regex: .*
42+
separator: ;
43+
metric_name_selectors:
44+
- ^.*$
45+
- dimensions:
46+
- - name
47+
label_matchers:
48+
- label_names:
49+
- name
50+
regex: .*
51+
separator: ;
52+
metric_name_selectors:
53+
- ^node_cpu_guest_seconds_total$
54+
metric_descriptors:
55+
- metric_name: nginx_request_count
56+
overwrite: false
57+
unit: Count
58+
middleware: agenthealth/logs
59+
namespace: CustomizedNamespace
60+
no_verify_ssl: false
61+
num_workers: 8
62+
output_destination: cloudwatch
63+
profile: ""
64+
proxy_address: ""
65+
region: us-east-1
66+
request_timeout_seconds: 30
67+
resource_arn: ""
68+
resource_to_telemetry_conversion:
69+
enabled: true
70+
retain_initial_value_of_delta_metric: false
71+
role_arn: ""
72+
version: "0"
73+
extensions:
74+
agenthealth/logs:
75+
is_usage_data_enabled: true
76+
stats:
77+
operations:
78+
- PutLogEvents
79+
usage_flags:
80+
mode: EC2
81+
region_type: ACJ
82+
agenthealth/statuscode:
83+
is_status_code_enabled: true
84+
is_usage_data_enabled: true
85+
stats:
86+
usage_flags:
87+
mode: EC2
88+
region_type: ACJ
89+
ecs_observer:
90+
cluster_name: ecs-cluster-a
91+
cluster_region: us-west-1
92+
docker_labels:
93+
- job_name: ""
94+
job_name_label: ECS_PROMETHEUS_JOB_NAME_1
95+
metrics_path: ""
96+
metrics_path_label: ECS_PROMETHEUS_METRICS_PATH
97+
port_label: ECS_PROMETHEUS_EXPORTER_PORT_SUBSET
98+
job_label_name: ""
99+
refresh_interval: 1m0s
100+
result_file: '{ecsSdFileName}'
101+
services:
102+
- container_name_pattern: nginx-prometheus-exporter
103+
job_name: service_name_1
104+
metrics_path: /metrics
105+
metrics_ports:
106+
- 9113
107+
name_pattern: .*-application-stack
108+
- container_name_pattern: ""
109+
job_name: ""
110+
metrics_path: /stats/metrics
111+
metrics_ports:
112+
- 9114
113+
name_pattern: run-application-stack
114+
task_definitions:
115+
- arn_pattern: .*task_def_1:[0-9]+
116+
container_name_pattern: ""
117+
job_name: task_def_1
118+
metrics_path: /stats/metrics
119+
metrics_ports:
120+
- 9901
121+
- arn_pattern: task_def_2
122+
container_name_pattern: ^envoy$
123+
job_name: ""
124+
metrics_path: /metrics
125+
metrics_ports:
126+
- 9902
127+
entitystore:
128+
mode: ec2
129+
region: us-east-1
130+
processors:
131+
batch/prometheus/cloudwatchlogs:
132+
metadata_cardinality_limit: 1000
133+
send_batch_max_size: 0
134+
send_batch_size: 8192
135+
timeout: 30s
136+
prometheusadapter/prometheus/cloudwatchlogs: {}
137+
receivers:
138+
prometheus/prometheus/cloudwatchlogs:
139+
config:
140+
global:
141+
evaluation_interval: 1m
142+
scrape_interval: 5s
143+
scrape_protocols:
144+
- OpenMetricsText1.0.0
145+
- OpenMetricsText0.0.1
146+
- PrometheusText1.0.0
147+
- PrometheusText0.0.4
148+
scrape_timeout: 5s
149+
scrape_configs:
150+
- enable_compression: true
151+
enable_http2: true
152+
fallback_scrape_protocol: PrometheusText0.0.4
153+
follow_redirects: true
154+
honor_timestamps: true
155+
job_name: prometheus_test_job
156+
metric_relabel_configs:
157+
- action: replace
158+
regex: (.*)
159+
replacement: $$$$1
160+
separator: ;
161+
source_labels:
162+
- __name__
163+
target_label: my_name
164+
metrics_path: /metrics
165+
scheme: http
166+
scrape_interval: 5s
167+
scrape_protocols:
168+
- OpenMetricsText1.0.0
169+
- OpenMetricsText0.0.1
170+
- PrometheusText1.0.0
171+
- PrometheusText0.0.4
172+
scrape_timeout: 5s
173+
static_configs:
174+
- targets:
175+
- localhost:8101
176+
track_timestamps_staleness: false
177+
report_extra_scrape_metrics: false
178+
start_time_metric_regex: ""
179+
trim_metric_suffixes: false
180+
use_start_time_metric: false
181+
service:
182+
extensions:
183+
- agenthealth/logs
184+
- agenthealth/statuscode
185+
- ecs_observer
186+
- entitystore
187+
pipelines:
188+
metrics/prometheus/cloudwatchlogs:
189+
exporters:
190+
- awsemf/prometheus
191+
processors:
192+
- prometheusadapter/prometheus/cloudwatchlogs
193+
- batch/prometheus/cloudwatchlogs
194+
receivers:
195+
- prometheus/prometheus/cloudwatchlogs
196+
telemetry:
197+
logs:
198+
encoding: console
199+
level: info
200+
sampling:
201+
enabled: true
202+
initial: 2
203+
thereafter: 500
204+
tick: 10s
205+
metrics:
206+
level: None
207+
traces:
208+
level: None

translator/tocwconfig/tocwconfig_test.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ var prometheusConfig string
5454
//go:embed sampleConfig/prometheus_cwa_config.yaml
5555
var prometheusPMDConfig string
5656

57+
//go:embed sampleConfig/prometheus_expansion.yaml
58+
var prometheusExpansionConfig string
59+
5760
type testCase struct {
5861
filename string
5962
targetPlatform string
@@ -462,6 +465,25 @@ func TestPrometheusPMDConfig(t *testing.T) {
462465
checkTranslation(t, "prometheus_pmd_config", "linux", expectedEnvVars, "", tokenReplacements)
463466
}
464467

468+
func TestPrometheusExpansionConfig(t *testing.T) {
469+
resetContext(t)
470+
context.CurrentContext().SetRunInContainer(true)
471+
context.CurrentContext().SetMode(config.ModeEC2)
472+
t.Setenv(config.HOST_NAME, "host_name_from_env")
473+
474+
temp := t.TempDir()
475+
prometheusConfigFileName := filepath.Join(temp, "prometheus.yaml")
476+
err := os.WriteFile(prometheusConfigFileName, []byte(prometheusExpansionConfig), 0600)
477+
require.NoError(t, err)
478+
479+
tokenReplacements := map[string]string{
480+
prometheusFileNameToken: strings.ReplaceAll(prometheusConfigFileName, "\\", "\\\\"),
481+
}
482+
483+
expectedEnvVars := map[string]string{}
484+
checkTranslation(t, "prometheus_expansion_config", "linux", expectedEnvVars, "", tokenReplacements)
485+
}
486+
465487
func TestPrometheusConfigwithTargetAllocator(t *testing.T) {
466488
resetContext(t)
467489
context.CurrentContext().SetRunInContainer(true)
@@ -924,7 +946,7 @@ func verifyToTomlTranslation(t *testing.T, input interface{}, desiredTomlPath st
924946
_, decodeError2 := toml.Decode(tomlStr, &actual)
925947
assert.NoError(t, decodeError2)
926948

927-
// assert.NoError(t, os.WriteFile(desiredTomlPath, []byte(tomlStr), 0644)) // useful for regenerating TOML
949+
//assert.NoError(t, os.WriteFile(desiredTomlPath, []byte(tomlStr), 0644)) // useful for regenerating TOML
928950

929951
// This less function sort the content of string slice in alphabetical order so the
930952
// cmp.Equal method will compare the two struct with slices in them, regardless the elements within the slices

0 commit comments

Comments
 (0)