1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
telemetry:
exporters:
metrics:
prometheus:
enabled: true
otlp:
enabled: true
endpoint: default
tracing:
otlp:
enabled: true
endpoint: default
zipkin:
enabled: true
endpoint: default
datadog:
enabled: true
endpoint: default
jaeger:
enabled: true
agent:
endpoint: default
logging:
experimental_when_header:
- name: apollo-router-log-request
value: test
headers: true # default: false
body: true # default: false
# log request for all requests coming from Iphones
- name: custom-header
match: ^foo.*
headers: true
instrumentation:
spans:
mode: spec_compliant
default_attribute_requirement_level: recommended
router:
attributes:
"custom_one":
request_header: host
supergraph:
attributes:
graphql.document: true
subgraph:
attributes:
subgraph.graphql.document: true
instruments:
router:
http.server.request.body.size:
attributes:
# Standard attributes
http.response.status_code: true
"my_attribute":
response_header: "content-type"
http.server.request.duration:
attributes:
# Standard attributes
http.response.status_code: true
http.request.method: true
# Custom attribute
"my_attribute":
response_header: "content-type"
my.request.duration: # The name of your custom instrument/metric
value: duration
type: counter
unit: s
description: "my description"
acme.request.size: # The name of your custom instrument/metric
value:
request_header: "content-length"
type: counter
unit: s
description: "my description"
acme.request.length: # The name of your custom instrument/metric
value:
request_header: "content-length"
type: histogram
unit: s
description: "my description"
supergraph:
acme.graphql.requests:
value: unit
type: counter
unit: request
description: "supergraph requests"
attributes:
static: hello
graphql_operation_kind:
operation_kind: string
subgraph:
request_including_price1:
value: unit
type: counter
unit: request
description: "supergraph requests"
condition:
exists:
subgraph_response_data: "$.products[*].price1"
attributes:
subgraph.name: true
graphql:
list.length: true
field.execution: true
events:
router:
# Standard events
request: info
response: info
error: info
# Custom events
my.request_event:
message: "my event message"
level: info
on: request
attributes:
http.request.body.size: true
# Only log when the x-log-request header is `log`
condition:
eq:
- "log"
- request_header: "x-log-request"
my.response_event:
message: "my response event message"
level: info
on: response
attributes:
http.response.body.size: true
# Only log when the x-log-request header is `log`
condition:
eq:
- "log"
- response_header: "x-log-request"
supergraph:
# Standard events
request: info
response: info
error: info
# Custom events
my.request.event:
message: "my event message"
level: info
on: request
# Only log when the x-log-request header is `log`
condition:
eq:
- "log"
- request_header: "x-log-request"
my.response_event:
message: "my response event message"
level: warn
on: response
condition:
eq:
- "log"
- response_header: "x-log-request"
subgraph:
# Standard events
request: info
response: warn
error: error
# Custom events
my.request.event:
message: "my event message"
level: info
on: request
my.response.event:
message: "my response event message"
level: error
on: response
attributes:
subgraph.name: true
response_status:
subgraph_response_status: code