Skip to content

Commit 9ee49d9

Browse files
Add Netflix-owned Common IPC metrics glossary fragment
Covers ipc.client.call, ipc.server.call, their inbound/outbound size distributions, and ipc.server.inflight, along with tag definitions for ipc.protocol, ipc.status, ipc.attempt, ipc.vip, ipc.endpoint, client/server app/asg/cluster, owner, and build.revision. Auto-discovered via the classpath glossary mechanism, complementing the AWS CloudWatch fragment. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent dcf363c commit 9ee49d9

2 files changed

Lines changed: 186 additions & 0 deletions

File tree

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
{
2+
"id": "netflix-ipc",
3+
"description": "Common IPC metrics emitted by Netflix's service mesh (proxyd) and paved-path IPC clients/servers. Unlike AWS CloudWatch metrics, these are instrumented and controlled by Netflix engineering directly.",
4+
5+
"tagKeys": {
6+
"ipc.protocol": {
7+
"description": "Wire protocol used for the call.",
8+
"category": "ipc",
9+
"valuesType": "examples",
10+
"values": ["grpc", "http_1", "http_2"]
11+
},
12+
"ipc.result": {
13+
"description": "High-level outcome of the call.",
14+
"category": "ipc",
15+
"valuesType": "enum",
16+
"values": ["success", "failure"]
17+
},
18+
"ipc.status": {
19+
"description": "Detailed status of the call, consistently mapped from HTTP/gRPC status codes across the dashboarding stack.",
20+
"category": "ipc",
21+
"valuesType": "examples",
22+
"values": [
23+
"success",
24+
"bad_request",
25+
"timeout",
26+
"throttled",
27+
"unavailable",
28+
"access_denied",
29+
"unexpected_error"
30+
]
31+
},
32+
"ipc.attempt": {
33+
"description": "Retry attempt number for the call, derived from the Netflix-Egress-Attempt header.",
34+
"category": "ipc",
35+
"valuesType": "enum",
36+
"values": ["initial", "second", "third_up"]
37+
},
38+
"ipc.vip": {
39+
"description": "Virtual IP (VIP) or service name of the target. For ipc.client.call, derived from the target address pattern (VIP, Secure, gRPC, or EurekaDNS); defaults to the authority header if unmatched. For ipc.server.call, set from the Netflix-Vip header, or 'unknown'.",
40+
"category": "ipc"
41+
},
42+
"ipc.endpoint": {
43+
"description": "Logical endpoint name for the call, set from the Netflix-Egress-Endpoint-Name / Netflix-Ingress-Endpoint-Name header.",
44+
"category": "ipc"
45+
},
46+
"ipc.client.app": {
47+
"description": "Application identifier of the calling service, derived from the Netflix-Egress-Client-Id header.",
48+
"category": "ipc"
49+
},
50+
"ipc.server.app": {
51+
"description": "Application identifier of the upstream/server instance handling the call.",
52+
"category": "ipc"
53+
},
54+
"ipc.client.asg": {
55+
"description": "Auto-scaling group of the calling instance, derived from the request Netflix-ASG header.",
56+
"category": "ipc"
57+
},
58+
"ipc.client.cluster": {
59+
"description": "Cluster of the calling instance, derived from the request Netflix-ASG header.",
60+
"category": "ipc"
61+
},
62+
"ipc.server.asg": {
63+
"description": "Auto-scaling group of the server instance, derived from the response Netflix-ASG header.",
64+
"category": "ipc"
65+
},
66+
"ipc.server.cluster": {
67+
"description": "Cluster of the server instance, derived from the response Netflix-ASG header.",
68+
"category": "ipc"
69+
},
70+
"owner": {
71+
"description": "Component that emitted the metric. Filter by owner=proxyd to isolate metrics emitted by the mesh proxy and avoid double-counting against metrics emitted directly by a workload.",
72+
"category": "ipc",
73+
"valuesType": "examples",
74+
"values": ["proxyd"]
75+
},
76+
"build.revision": {
77+
"description": "Version of the main packages (proxyd, Envoy) that emitted the metric.",
78+
"category": "ipc"
79+
}
80+
},
81+
82+
"metrics": {
83+
"ipc.client.call": {
84+
"description": "Timer recording the latency of outgoing IPC calls made by a client.",
85+
"unit": "seconds",
86+
"category": "ipc/client",
87+
"type": "timer",
88+
"tags": {
89+
"ipc.protocol": { "description": "Wire protocol used for the call." },
90+
"ipc.result": { "description": "High-level outcome of the call." },
91+
"ipc.status": { "description": "Detailed status of the call." },
92+
"ipc.attempt": { "description": "Retry attempt number for the call." },
93+
"ipc.vip": { "description": "Target VIP or service name." },
94+
"ipc.endpoint": { "description": "Target logical endpoint name." },
95+
"ipc.client.app": { "description": "Calling application identifier." },
96+
"ipc.server.app": { "description": "Called application identifier." },
97+
"ipc.client.asg": { "description": "Calling instance's auto-scaling group." },
98+
"ipc.client.cluster": { "description": "Calling instance's cluster." },
99+
"ipc.server.asg": { "description": "Server instance's auto-scaling group." },
100+
"ipc.server.cluster": { "description": "Server instance's cluster." },
101+
"owner": { "description": "Component that emitted the metric, e.g. proxyd." }
102+
}
103+
},
104+
"ipc.client.call.size.inbound": {
105+
"description": "Distribution summary of the response payload size received by the client for an IPC call.",
106+
"unit": "bytes",
107+
"category": "ipc/client",
108+
"type": "distribution-summary",
109+
"tags": {
110+
"ipc.protocol": { "description": "Wire protocol used for the call." },
111+
"ipc.vip": { "description": "Target VIP or service name." },
112+
"ipc.endpoint": { "description": "Target logical endpoint name." }
113+
}
114+
},
115+
"ipc.client.call.size.outbound": {
116+
"description": "Distribution summary of the request payload size sent by the client for an IPC call.",
117+
"unit": "bytes",
118+
"category": "ipc/client",
119+
"type": "distribution-summary",
120+
"tags": {
121+
"ipc.protocol": { "description": "Wire protocol used for the call." },
122+
"ipc.vip": { "description": "Target VIP or service name." },
123+
"ipc.endpoint": { "description": "Target logical endpoint name." }
124+
}
125+
},
126+
"ipc.server.call": {
127+
"description": "Timer recording the latency of incoming IPC calls handled by a server.",
128+
"unit": "seconds",
129+
"category": "ipc/server",
130+
"type": "timer",
131+
"tags": {
132+
"ipc.protocol": { "description": "Wire protocol used for the call." },
133+
"ipc.result": { "description": "High-level outcome of the call." },
134+
"ipc.status": { "description": "Detailed status of the call." },
135+
"ipc.vip": { "description": "VIP the request was addressed to, or 'unknown'." },
136+
"ipc.endpoint": { "description": "Logical endpoint name that served the call." },
137+
"ipc.client.app": { "description": "Calling application identifier." },
138+
"ipc.server.app": { "description": "This application's identifier." },
139+
"ipc.client.asg": { "description": "Calling instance's auto-scaling group." },
140+
"ipc.client.cluster": { "description": "Calling instance's cluster." },
141+
"owner": { "description": "Component that emitted the metric, e.g. proxyd." }
142+
}
143+
},
144+
"ipc.server.call.size.inbound": {
145+
"description": "Distribution summary of the request payload size received by the server for an IPC call.",
146+
"unit": "bytes",
147+
"category": "ipc/server",
148+
"type": "distribution-summary",
149+
"tags": {
150+
"ipc.protocol": { "description": "Wire protocol used for the call." },
151+
"ipc.endpoint": { "description": "Logical endpoint name that served the call." }
152+
}
153+
},
154+
"ipc.server.call.size.outbound": {
155+
"description": "Distribution summary of the response payload size sent by the server for an IPC call.",
156+
"unit": "bytes",
157+
"category": "ipc/server",
158+
"type": "distribution-summary",
159+
"tags": {
160+
"ipc.protocol": { "description": "Wire protocol used for the call." },
161+
"ipc.endpoint": { "description": "Logical endpoint name that served the call." }
162+
}
163+
},
164+
"ipc.server.inflight": {
165+
"description": "Gauge tracking the number of IPC requests currently being processed concurrently by a server.",
166+
"unit": "requests",
167+
"category": "ipc/server",
168+
"type": "gauge",
169+
"tags": {
170+
"ipc.endpoint": { "description": "Logical endpoint name that served the call." },
171+
"owner": { "description": "Component that emitted the metric, e.g. proxyd." }
172+
}
173+
}
174+
}
175+
}

atlas-lsp/src/test/scala/com/netflix/atlas/lsp/GlossarySuite.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,23 @@ class GlossarySuite extends FunSuite {
167167
assert(cloudwatch.tagKeys.contains("aws.function"))
168168
}
169169

170+
test("loadAllFromClasspath: discovers netflix-ipc fragment") {
171+
val fragments = Glossary.loadAllFromClasspath()
172+
val ipc = fragments.find(_.id == "netflix-ipc").get
173+
assert(ipc.metrics.contains("ipc.client.call"))
174+
assert(ipc.metrics.contains("ipc.server.call"))
175+
assert(ipc.metrics.contains("ipc.server.inflight"))
176+
assert(ipc.tagKeys.contains("ipc.vip"))
177+
assert(ipc.tagKeys.contains("owner"))
178+
}
179+
170180
test("loadAll: merges classpath fragments with configured files") {
171181
val config =
172182
ConfigFactory.parseString("""atlas.lsp.glossary.files = ["sample-glossary.json"]""")
173183
val merged = Glossary.loadAll(config)
174184
assert(merged.metrics.contains("aws.lambda.duration"))
175185
assert(merged.metrics.contains("sys.cpu.utilization"))
186+
assert(merged.metrics.contains("ipc.client.call"))
176187
}
177188

178189
test("loadAll: no configured files still discovers classpath fragments") {

0 commit comments

Comments
 (0)