@ancplua/qyl-api-schema 0.2.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/LICENSE +201 -0
- package/README.md +89 -0
- package/VERSIONING.md +74 -0
- package/api/routes.tsp +1052 -0
- package/api/streaming.tsp +335 -0
- package/common/errors.tsp +206 -0
- package/common/pagination.tsp +254 -0
- package/common/types.tsp +345 -0
- package/generated/README.md +26 -0
- package/generated/otel-keys.gen.tsp +1648 -0
- package/index.tsp +55 -0
- package/intelligence/causal-rules.tsp +34 -0
- package/intelligence/diagnostic-patterns.tsp +54 -0
- package/intelligence/investigation-strategies.tsp +37 -0
- package/intelligence/main.tsp +19 -0
- package/intelligence/seed/patterns.tsp +172 -0
- package/intelligence/seed/rules.tsp +44 -0
- package/intelligence/seed/strategies.tsp +56 -0
- package/intelligence/signals.tsp +60 -0
- package/models/agent/agent-run.tsp +154 -0
- package/models/agent/tool-call.tsp +122 -0
- package/models/agent/workflow-checkpoint.tsp +50 -0
- package/models/agent/workflow-execution.tsp +136 -0
- package/models/alerting.tsp +436 -0
- package/models/configurator.tsp +433 -0
- package/models/control-graph.tsp +197 -0
- package/models/db.tsp +810 -0
- package/models/deployment.tsp +365 -0
- package/models/error.tsp +433 -0
- package/models/genai.tsp +1368 -0
- package/models/http.tsp +600 -0
- package/models/identity.tsp +213 -0
- package/models/issues.tsp +484 -0
- package/models/log.tsp +140 -0
- package/models/messaging.tsp +304 -0
- package/models/otel-config.tsp +455 -0
- package/models/retention.tsp +240 -0
- package/models/rpc.tsp +309 -0
- package/models/search.tsp +243 -0
- package/models/session.tsp +274 -0
- package/models/system.tsp +400 -0
- package/models/test.tsp +346 -0
- package/models/triage.tsp +113 -0
- package/models/workflow.tsp +396 -0
- package/models/workspace.tsp +435 -0
- package/otel/enums.tsp +392 -0
- package/otel/logs.tsp +135 -0
- package/otel/metrics.tsp +358 -0
- package/otel/otel-conventions.tsp +14 -0
- package/otel/profiles.tsp +335 -0
- package/otel/resource.tsp +257 -0
- package/otel/span.tsp +307 -0
- package/package.json +88 -0
- package/tspconfig.yaml +49 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// ANcpLua v2.0 - OpenTelemetry Resource Model
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Resource attributes identifying the entity producing telemetry.
|
|
5
|
+
// =============================================================================
|
|
6
|
+
|
|
7
|
+
import "../common/types.tsp";
|
|
8
|
+
import "./enums.tsp";
|
|
9
|
+
|
|
10
|
+
using Qyl.Api.Contracts.Common;
|
|
11
|
+
|
|
12
|
+
namespace Qyl.Api.Contracts.OTel.Resource;
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Resource Model
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
@doc("Resource describes the entity producing telemetry")
|
|
19
|
+
model Resource {
|
|
20
|
+
@doc("Service name (required)")
|
|
21
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Service.Name)
|
|
22
|
+
serviceName: string;
|
|
23
|
+
|
|
24
|
+
@doc("Service namespace for grouping")
|
|
25
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Service.Namespace)
|
|
26
|
+
serviceNamespace?: string;
|
|
27
|
+
|
|
28
|
+
@doc("Service instance ID (unique per instance)")
|
|
29
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Service.InstanceId)
|
|
30
|
+
serviceInstanceId?: string;
|
|
31
|
+
|
|
32
|
+
@doc("Service version")
|
|
33
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Service.Version)
|
|
34
|
+
serviceVersion?: SemVer;
|
|
35
|
+
|
|
36
|
+
@doc("Telemetry SDK name")
|
|
37
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Telemetry.SdkName)
|
|
38
|
+
telemetrySdkName?: string;
|
|
39
|
+
|
|
40
|
+
@doc("Telemetry SDK language")
|
|
41
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Telemetry.SdkLanguage)
|
|
42
|
+
telemetrySdkLanguage?: Enums.TelemetrySdkLanguage;
|
|
43
|
+
|
|
44
|
+
@doc("Telemetry SDK version")
|
|
45
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Telemetry.SdkVersion)
|
|
46
|
+
telemetrySdkVersion?: SemVer;
|
|
47
|
+
|
|
48
|
+
@doc("Auto-instrumentation agent name")
|
|
49
|
+
@encodedName("application/json", "telemetry.auto.version")
|
|
50
|
+
telemetryAutoVersion?: SemVer;
|
|
51
|
+
|
|
52
|
+
@doc("Deployment environment (e.g., production, staging)")
|
|
53
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Deployment.EnvironmentName)
|
|
54
|
+
deploymentEnvironment?: string;
|
|
55
|
+
|
|
56
|
+
@doc("Cloud provider")
|
|
57
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Cloud.Provider)
|
|
58
|
+
cloudProvider?: CloudProvider;
|
|
59
|
+
|
|
60
|
+
@doc("Cloud region")
|
|
61
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Cloud.Region)
|
|
62
|
+
cloudRegion?: string;
|
|
63
|
+
|
|
64
|
+
@doc("Cloud availability zone")
|
|
65
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Cloud.AvailabilityZone)
|
|
66
|
+
cloudAvailabilityZone?: string;
|
|
67
|
+
|
|
68
|
+
@doc("Cloud account ID")
|
|
69
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Cloud.AccountId)
|
|
70
|
+
cloudAccountId?: string;
|
|
71
|
+
|
|
72
|
+
@doc("Cloud platform (e.g., aws_ecs, gcp_cloud_run)")
|
|
73
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Cloud.Platform)
|
|
74
|
+
cloudPlatform?: string;
|
|
75
|
+
|
|
76
|
+
@doc("Host name")
|
|
77
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Host.Name)
|
|
78
|
+
hostName?: string;
|
|
79
|
+
|
|
80
|
+
@doc("Host ID")
|
|
81
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Host.Id)
|
|
82
|
+
hostId?: string;
|
|
83
|
+
|
|
84
|
+
@doc("Host type (e.g., n1-standard-1)")
|
|
85
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Host.Type)
|
|
86
|
+
hostType?: string;
|
|
87
|
+
|
|
88
|
+
@doc("Host architecture (e.g., amd64, arm64)")
|
|
89
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Host.Arch)
|
|
90
|
+
hostArch?: HostArch;
|
|
91
|
+
|
|
92
|
+
@doc("Operating system type")
|
|
93
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Os.Type)
|
|
94
|
+
osType?: OsType;
|
|
95
|
+
|
|
96
|
+
@doc("Operating system description")
|
|
97
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Os.Description)
|
|
98
|
+
osDescription?: string;
|
|
99
|
+
|
|
100
|
+
@doc("Operating system version")
|
|
101
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Os.Version)
|
|
102
|
+
osVersion?: string;
|
|
103
|
+
|
|
104
|
+
@doc("Process ID")
|
|
105
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Process.Pid)
|
|
106
|
+
processPid?: int64;
|
|
107
|
+
|
|
108
|
+
@doc("Process executable name")
|
|
109
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Process.ExecutableName)
|
|
110
|
+
processExecutableName?: string;
|
|
111
|
+
|
|
112
|
+
@doc("Process command line")
|
|
113
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Process.CommandLine)
|
|
114
|
+
processCommandLine?: string;
|
|
115
|
+
|
|
116
|
+
@doc("Process runtime name")
|
|
117
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Process.RuntimeName)
|
|
118
|
+
processRuntimeName?: string;
|
|
119
|
+
|
|
120
|
+
@doc("Process runtime version")
|
|
121
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Process.RuntimeVersion)
|
|
122
|
+
processRuntimeVersion?: string;
|
|
123
|
+
|
|
124
|
+
@doc("Container ID")
|
|
125
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Container.Id)
|
|
126
|
+
containerId?: string;
|
|
127
|
+
|
|
128
|
+
@doc("Container name")
|
|
129
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Container.Name)
|
|
130
|
+
containerName?: string;
|
|
131
|
+
|
|
132
|
+
@doc("Container image name")
|
|
133
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.Container.ImageName)
|
|
134
|
+
containerImageName?: string;
|
|
135
|
+
|
|
136
|
+
@doc("Container image tag")
|
|
137
|
+
@encodedName("application/json", "container.image.tag")
|
|
138
|
+
containerImageTag?: string;
|
|
139
|
+
|
|
140
|
+
@doc("Kubernetes cluster name")
|
|
141
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.K8s.ClusterName)
|
|
142
|
+
k8sClusterName?: string;
|
|
143
|
+
|
|
144
|
+
@doc("Kubernetes namespace")
|
|
145
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.K8s.NamespaceName)
|
|
146
|
+
k8sNamespaceName?: string;
|
|
147
|
+
|
|
148
|
+
@doc("Kubernetes pod name")
|
|
149
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.K8s.PodName)
|
|
150
|
+
k8sPodName?: string;
|
|
151
|
+
|
|
152
|
+
@doc("Kubernetes pod UID")
|
|
153
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.K8s.PodUid)
|
|
154
|
+
k8sPodUid?: string;
|
|
155
|
+
|
|
156
|
+
@doc("Kubernetes deployment name")
|
|
157
|
+
@encodedName("application/json", ANcpLua.OpenTelemetry.SemanticConventions.Keys.K8s.DeploymentName)
|
|
158
|
+
k8sDeploymentName?: string;
|
|
159
|
+
|
|
160
|
+
@doc("Additional resource attributes")
|
|
161
|
+
attributes?: Attribute[];
|
|
162
|
+
|
|
163
|
+
@doc("Dropped attributes count")
|
|
164
|
+
@encodedName("application/json", "dropped_attributes_count")
|
|
165
|
+
droppedAttributesCount?: Count;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// =============================================================================
|
|
169
|
+
// Resource-Related Enums
|
|
170
|
+
// =============================================================================
|
|
171
|
+
|
|
172
|
+
@doc("Cloud provider types")
|
|
173
|
+
enum CloudProvider {
|
|
174
|
+
@doc("Alibaba Cloud")
|
|
175
|
+
alibabaCloud: "alibaba_cloud",
|
|
176
|
+
|
|
177
|
+
@doc("Amazon Web Services")
|
|
178
|
+
aws: "aws",
|
|
179
|
+
|
|
180
|
+
@doc("Microsoft Azure")
|
|
181
|
+
azure: "azure",
|
|
182
|
+
|
|
183
|
+
@doc("Google Cloud Platform")
|
|
184
|
+
gcp: "gcp",
|
|
185
|
+
|
|
186
|
+
@doc("Heroku")
|
|
187
|
+
heroku: "heroku",
|
|
188
|
+
|
|
189
|
+
@doc("IBM Cloud")
|
|
190
|
+
ibmCloud: "ibm_cloud",
|
|
191
|
+
|
|
192
|
+
@doc("Tencent Cloud")
|
|
193
|
+
tencentCloud: "tencent_cloud",
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@doc("Host architecture types")
|
|
197
|
+
enum HostArch {
|
|
198
|
+
@doc("AMD64 / x86_64")
|
|
199
|
+
amd64: "amd64",
|
|
200
|
+
|
|
201
|
+
@doc("ARM32")
|
|
202
|
+
arm32: "arm32",
|
|
203
|
+
|
|
204
|
+
@doc("ARM64 / aarch64")
|
|
205
|
+
arm64: "arm64",
|
|
206
|
+
|
|
207
|
+
@doc("Itanium")
|
|
208
|
+
ia64: "ia64",
|
|
209
|
+
|
|
210
|
+
@doc("PowerPC 32-bit")
|
|
211
|
+
ppc32: "ppc32",
|
|
212
|
+
|
|
213
|
+
@doc("PowerPC 64-bit")
|
|
214
|
+
ppc64: "ppc64",
|
|
215
|
+
|
|
216
|
+
@doc("IBM z/Architecture")
|
|
217
|
+
s390x: "s390x",
|
|
218
|
+
|
|
219
|
+
@doc("x86 32-bit")
|
|
220
|
+
x86: "x86",
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
@doc("Operating system types")
|
|
224
|
+
enum OsType {
|
|
225
|
+
@doc("Microsoft Windows")
|
|
226
|
+
windows: "windows",
|
|
227
|
+
|
|
228
|
+
@doc("Linux")
|
|
229
|
+
linux: "linux",
|
|
230
|
+
|
|
231
|
+
@doc("Apple macOS")
|
|
232
|
+
darwin: "darwin",
|
|
233
|
+
|
|
234
|
+
@doc("FreeBSD")
|
|
235
|
+
freebsd: "freebsd",
|
|
236
|
+
|
|
237
|
+
@doc("NetBSD")
|
|
238
|
+
netbsd: "netbsd",
|
|
239
|
+
|
|
240
|
+
@doc("OpenBSD")
|
|
241
|
+
openbsd: "openbsd",
|
|
242
|
+
|
|
243
|
+
@doc("DragonFly BSD")
|
|
244
|
+
dragonflybsd: "dragonflybsd",
|
|
245
|
+
|
|
246
|
+
@doc("HP-UX")
|
|
247
|
+
hpux: "hpux",
|
|
248
|
+
|
|
249
|
+
@doc("AIX")
|
|
250
|
+
aix: "aix",
|
|
251
|
+
|
|
252
|
+
@doc("Oracle Solaris")
|
|
253
|
+
solaris: "solaris",
|
|
254
|
+
|
|
255
|
+
@doc("IBM z/OS")
|
|
256
|
+
zOs: "z_os",
|
|
257
|
+
}
|
package/otel/span.tsp
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// ANcpLua v2.0 - OpenTelemetry Span Model
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Distributed tracing span representation following OTel specification.
|
|
5
|
+
// =============================================================================
|
|
6
|
+
|
|
7
|
+
import "@typespec/http";
|
|
8
|
+
import "@typespec/openapi";
|
|
9
|
+
import "../common/types.tsp";
|
|
10
|
+
import "./enums.tsp";
|
|
11
|
+
import "./resource.tsp";
|
|
12
|
+
|
|
13
|
+
using TypeSpec.Http;
|
|
14
|
+
using TypeSpec.OpenAPI;
|
|
15
|
+
using Qyl.Api.Contracts.Common;
|
|
16
|
+
using Qyl.Api.Contracts.OTel.Enums;
|
|
17
|
+
using Qyl.Api.Contracts.OTel.Resource;
|
|
18
|
+
|
|
19
|
+
namespace Qyl.Api.Contracts.OTel.Traces;
|
|
20
|
+
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Span Model
|
|
23
|
+
// =============================================================================
|
|
24
|
+
|
|
25
|
+
@doc("OpenTelemetry Span representing a single operation in a distributed trace")
|
|
26
|
+
model Span {
|
|
27
|
+
@doc("Unique span identifier (16 hex chars)")
|
|
28
|
+
@key
|
|
29
|
+
@encodedName("application/json", "span_id")
|
|
30
|
+
spanId: SpanId;
|
|
31
|
+
|
|
32
|
+
@doc("Trace identifier (32 hex chars)")
|
|
33
|
+
@encodedName("application/json", "trace_id")
|
|
34
|
+
traceId: TraceId;
|
|
35
|
+
|
|
36
|
+
@doc("Parent span identifier (null for root spans)")
|
|
37
|
+
@encodedName("application/json", "parent_span_id")
|
|
38
|
+
parentSpanId?: SpanId;
|
|
39
|
+
|
|
40
|
+
@doc("W3C trace state")
|
|
41
|
+
@encodedName("application/json", "trace_state")
|
|
42
|
+
traceState?: TraceState;
|
|
43
|
+
|
|
44
|
+
@doc("Human-readable span name")
|
|
45
|
+
@minLength(1)
|
|
46
|
+
name: string;
|
|
47
|
+
|
|
48
|
+
@doc("Span kind")
|
|
49
|
+
kind: SpanKind;
|
|
50
|
+
|
|
51
|
+
@doc("Start timestamp in nanoseconds since epoch")
|
|
52
|
+
@encodedName("application/json", "start_time_unix_nano")
|
|
53
|
+
startTimeUnixNano: UnixNanos;
|
|
54
|
+
|
|
55
|
+
@doc("End timestamp in nanoseconds since epoch")
|
|
56
|
+
@encodedName("application/json", "end_time_unix_nano")
|
|
57
|
+
endTimeUnixNano: UnixNanos;
|
|
58
|
+
|
|
59
|
+
@doc("Span attributes")
|
|
60
|
+
attributes?: Attribute[];
|
|
61
|
+
|
|
62
|
+
@doc("Dropped attributes count")
|
|
63
|
+
@encodedName("application/json", "dropped_attributes_count")
|
|
64
|
+
droppedAttributesCount?: Count;
|
|
65
|
+
|
|
66
|
+
@doc("Span events (logs attached to span)")
|
|
67
|
+
events?: SpanEvent[];
|
|
68
|
+
|
|
69
|
+
@doc("Dropped events count")
|
|
70
|
+
@encodedName("application/json", "dropped_events_count")
|
|
71
|
+
droppedEventsCount?: Count;
|
|
72
|
+
|
|
73
|
+
@doc("Links to other spans")
|
|
74
|
+
links?: SpanLink[];
|
|
75
|
+
|
|
76
|
+
@doc("Dropped links count")
|
|
77
|
+
@encodedName("application/json", "dropped_links_count")
|
|
78
|
+
droppedLinksCount?: Count;
|
|
79
|
+
|
|
80
|
+
@doc("Span status")
|
|
81
|
+
status: SpanStatus;
|
|
82
|
+
|
|
83
|
+
@doc("Span flags")
|
|
84
|
+
flags?: int32;
|
|
85
|
+
|
|
86
|
+
@doc("Resource describing the entity that produced this span")
|
|
87
|
+
resource: Qyl.Api.Contracts.OTel.Resource.Resource;
|
|
88
|
+
|
|
89
|
+
@doc("Instrumentation scope")
|
|
90
|
+
@encodedName("application/json", "instrumentation_scope")
|
|
91
|
+
instrumentationScope?: InstrumentationScope;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@doc("Span status")
|
|
95
|
+
model SpanStatus {
|
|
96
|
+
@doc("Status code")
|
|
97
|
+
code: SpanStatusCode;
|
|
98
|
+
|
|
99
|
+
@doc("Status message (only for ERROR status)")
|
|
100
|
+
message?: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@doc("Event occurring during a span's lifetime")
|
|
104
|
+
model SpanEvent {
|
|
105
|
+
@doc("Event name")
|
|
106
|
+
@minLength(1)
|
|
107
|
+
name: string;
|
|
108
|
+
|
|
109
|
+
@doc("Event timestamp in nanoseconds since epoch")
|
|
110
|
+
@encodedName("application/json", "time_unix_nano")
|
|
111
|
+
timeUnixNano: UnixNanos;
|
|
112
|
+
|
|
113
|
+
@doc("Event attributes")
|
|
114
|
+
attributes?: Attribute[];
|
|
115
|
+
|
|
116
|
+
@doc("Dropped attributes count")
|
|
117
|
+
@encodedName("application/json", "dropped_attributes_count")
|
|
118
|
+
droppedAttributesCount?: Count;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@doc("Link to another span (e.g., batch processing)")
|
|
122
|
+
model SpanLink {
|
|
123
|
+
@doc("Linked trace ID")
|
|
124
|
+
@encodedName("application/json", "trace_id")
|
|
125
|
+
traceId: TraceId;
|
|
126
|
+
|
|
127
|
+
@doc("Linked span ID")
|
|
128
|
+
@encodedName("application/json", "span_id")
|
|
129
|
+
spanId: SpanId;
|
|
130
|
+
|
|
131
|
+
@doc("Trace state of the linked span")
|
|
132
|
+
@encodedName("application/json", "trace_state")
|
|
133
|
+
traceState?: TraceState;
|
|
134
|
+
|
|
135
|
+
@doc("Link attributes")
|
|
136
|
+
attributes?: Attribute[];
|
|
137
|
+
|
|
138
|
+
@doc("Dropped attributes count")
|
|
139
|
+
@encodedName("application/json", "dropped_attributes_count")
|
|
140
|
+
droppedAttributesCount?: Count;
|
|
141
|
+
|
|
142
|
+
@doc("Link flags")
|
|
143
|
+
flags?: int32;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// =============================================================================
|
|
147
|
+
// Trace Model (Collection of Spans)
|
|
148
|
+
// =============================================================================
|
|
149
|
+
|
|
150
|
+
@doc("Complete trace containing all related spans")
|
|
151
|
+
model Trace {
|
|
152
|
+
@doc("Trace identifier")
|
|
153
|
+
@key
|
|
154
|
+
@encodedName("application/json", "trace_id")
|
|
155
|
+
traceId: TraceId;
|
|
156
|
+
|
|
157
|
+
@doc("All spans in this trace")
|
|
158
|
+
spans: Span[];
|
|
159
|
+
|
|
160
|
+
@doc("Root span of the trace")
|
|
161
|
+
@encodedName("application/json", "root_span")
|
|
162
|
+
rootSpan?: Span;
|
|
163
|
+
|
|
164
|
+
@doc("Total span count")
|
|
165
|
+
@encodedName("application/json", "span_count")
|
|
166
|
+
spanCount: int32;
|
|
167
|
+
|
|
168
|
+
@doc("Trace duration in nanoseconds")
|
|
169
|
+
@encodedName("application/json", "duration_ns")
|
|
170
|
+
durationNs: DurationNs;
|
|
171
|
+
|
|
172
|
+
@doc("Trace start time")
|
|
173
|
+
@encodedName("application/json", "start_time")
|
|
174
|
+
startTime: utcDateTime;
|
|
175
|
+
|
|
176
|
+
@doc("Trace end time")
|
|
177
|
+
@encodedName("application/json", "end_time")
|
|
178
|
+
endTime: utcDateTime;
|
|
179
|
+
|
|
180
|
+
@doc("Services involved in this trace")
|
|
181
|
+
services: string[];
|
|
182
|
+
|
|
183
|
+
@doc("Whether trace contains errors")
|
|
184
|
+
@encodedName("application/json", "has_error")
|
|
185
|
+
hasError: boolean;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// =============================================================================
|
|
189
|
+
// Span Query Filters
|
|
190
|
+
// =============================================================================
|
|
191
|
+
|
|
192
|
+
@doc("Filter parameters for querying spans")
|
|
193
|
+
model SpanQueryFilters {
|
|
194
|
+
@doc("Filter by trace ID")
|
|
195
|
+
@query
|
|
196
|
+
@encodedName("application/json", "trace_id")
|
|
197
|
+
traceId?: TraceId;
|
|
198
|
+
|
|
199
|
+
@doc("Filter by parent span ID")
|
|
200
|
+
@query
|
|
201
|
+
@encodedName("application/json", "parent_span_id")
|
|
202
|
+
parentSpanId?: SpanId;
|
|
203
|
+
|
|
204
|
+
@doc("Filter by span name (supports wildcards)")
|
|
205
|
+
@query
|
|
206
|
+
name?: string;
|
|
207
|
+
|
|
208
|
+
@doc("Filter by span kind")
|
|
209
|
+
@query
|
|
210
|
+
kind?: SpanKind;
|
|
211
|
+
|
|
212
|
+
@doc("Filter by service name")
|
|
213
|
+
@query
|
|
214
|
+
@encodedName("application/json", "service_name")
|
|
215
|
+
serviceName?: string;
|
|
216
|
+
|
|
217
|
+
@doc("Filter by status code")
|
|
218
|
+
@query
|
|
219
|
+
@encodedName("application/json", "status_code")
|
|
220
|
+
statusCode?: SpanStatusCode;
|
|
221
|
+
|
|
222
|
+
@doc("Minimum duration in nanoseconds")
|
|
223
|
+
@query
|
|
224
|
+
@encodedName("application/json", "min_duration_ns")
|
|
225
|
+
minDurationNs?: DurationNs;
|
|
226
|
+
|
|
227
|
+
@doc("Maximum duration in nanoseconds")
|
|
228
|
+
@query
|
|
229
|
+
@encodedName("application/json", "max_duration_ns")
|
|
230
|
+
maxDurationNs?: DurationNs;
|
|
231
|
+
|
|
232
|
+
@doc("Filter by attribute key-value pair")
|
|
233
|
+
@query
|
|
234
|
+
attribute?: string;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// =============================================================================
|
|
238
|
+
// Span Aggregations
|
|
239
|
+
// =============================================================================
|
|
240
|
+
|
|
241
|
+
@doc("Aggregated span statistics")
|
|
242
|
+
model SpanStats {
|
|
243
|
+
@doc("Total span count")
|
|
244
|
+
@encodedName("application/json", "total_count")
|
|
245
|
+
totalCount: Count;
|
|
246
|
+
|
|
247
|
+
@doc("Error count")
|
|
248
|
+
@encodedName("application/json", "error_count")
|
|
249
|
+
errorCount: Count;
|
|
250
|
+
|
|
251
|
+
@doc("Error rate (0.0 - 1.0)")
|
|
252
|
+
@encodedName("application/json", "error_rate")
|
|
253
|
+
errorRate: Ratio;
|
|
254
|
+
|
|
255
|
+
@doc("Average duration in nanoseconds")
|
|
256
|
+
@encodedName("application/json", "avg_duration_ns")
|
|
257
|
+
avgDurationNs: float64;
|
|
258
|
+
|
|
259
|
+
@doc("P50 duration in nanoseconds")
|
|
260
|
+
@encodedName("application/json", "p50_duration_ns")
|
|
261
|
+
p50DurationNs: DurationNs;
|
|
262
|
+
|
|
263
|
+
@doc("P90 duration in nanoseconds")
|
|
264
|
+
@encodedName("application/json", "p90_duration_ns")
|
|
265
|
+
p90DurationNs: DurationNs;
|
|
266
|
+
|
|
267
|
+
@doc("P99 duration in nanoseconds")
|
|
268
|
+
@encodedName("application/json", "p99_duration_ns")
|
|
269
|
+
p99DurationNs: DurationNs;
|
|
270
|
+
|
|
271
|
+
@doc("Minimum duration in nanoseconds")
|
|
272
|
+
@encodedName("application/json", "min_duration_ns")
|
|
273
|
+
minDurationNs: DurationNs;
|
|
274
|
+
|
|
275
|
+
@doc("Maximum duration in nanoseconds")
|
|
276
|
+
@encodedName("application/json", "max_duration_ns")
|
|
277
|
+
maxDurationNs: DurationNs;
|
|
278
|
+
|
|
279
|
+
@doc("Throughput (spans per second)")
|
|
280
|
+
@encodedName("application/json", "throughput_per_second")
|
|
281
|
+
throughputPerSecond: float64;
|
|
282
|
+
|
|
283
|
+
@doc("Stats grouped by service")
|
|
284
|
+
@encodedName("application/json", "by_service")
|
|
285
|
+
byService?: SpanStatsByDimension[];
|
|
286
|
+
|
|
287
|
+
@doc("Stats grouped by operation name")
|
|
288
|
+
@encodedName("application/json", "by_operation")
|
|
289
|
+
byOperation?: SpanStatsByDimension[];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
@doc("Span statistics for a specific dimension value")
|
|
293
|
+
model SpanStatsByDimension {
|
|
294
|
+
@doc("Dimension value (e.g., service name)")
|
|
295
|
+
dimension: string;
|
|
296
|
+
|
|
297
|
+
@doc("Span count for this dimension")
|
|
298
|
+
count: Count;
|
|
299
|
+
|
|
300
|
+
@doc("Average duration in nanoseconds")
|
|
301
|
+
@encodedName("application/json", "avg_duration_ns")
|
|
302
|
+
avgDurationNs: float64;
|
|
303
|
+
|
|
304
|
+
@doc("Error rate for this dimension")
|
|
305
|
+
@encodedName("application/json", "error_rate")
|
|
306
|
+
errorRate: Ratio;
|
|
307
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ancplua/qyl-api-schema",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "TypeSpec source of truth for qyl API contracts. Emits OpenAPI, JSON Schema, Qyl.Api.Contracts DTOs, and TypeScript contract types; not an OpenTelemetry package, storage schema, or server implementation.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/ANcpLua/qyl-api-schema.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/ANcpLua/qyl-api-schema#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/ANcpLua/qyl-api-schema/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"typespec",
|
|
16
|
+
"qyl",
|
|
17
|
+
"observability",
|
|
18
|
+
"contracts",
|
|
19
|
+
"openapi"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": "./index.tsp",
|
|
24
|
+
"./otel": "./otel/otel-conventions.tsp",
|
|
25
|
+
"./models/*": "./models/*.tsp",
|
|
26
|
+
"./models/agent/*": "./models/agent/*.tsp",
|
|
27
|
+
"./common/*": "./common/*.tsp",
|
|
28
|
+
"./api/*": "./api/*.tsp",
|
|
29
|
+
"./intelligence/*": "./intelligence/*.tsp",
|
|
30
|
+
"./intelligence/seed/*": "./intelligence/seed/*.tsp",
|
|
31
|
+
"./generated/otel-keys": "./generated/otel-keys.gen.tsp"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"index.tsp",
|
|
35
|
+
"api/**/*.tsp",
|
|
36
|
+
"common/**/*.tsp",
|
|
37
|
+
"intelligence/**/*.tsp",
|
|
38
|
+
"models/**/*.tsp",
|
|
39
|
+
"otel/**/*.tsp",
|
|
40
|
+
"generated/**/*.tsp",
|
|
41
|
+
"generated/README.md",
|
|
42
|
+
"tspconfig.yaml",
|
|
43
|
+
"README.md",
|
|
44
|
+
"VERSIONING.md",
|
|
45
|
+
"LICENSE"
|
|
46
|
+
],
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public",
|
|
49
|
+
"provenance": true,
|
|
50
|
+
"registry": "https://registry.npmjs.org"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build:emitters": "tsc -p emitters/telemetry-control-graph && tsc -p emitters/csharp && tsc -p emitters/ts-types && tsc -p emitters/otelconventions-lint",
|
|
54
|
+
"prepare": "npm run build:emitters",
|
|
55
|
+
"compile": "npm run build:emitters && tsp compile main.tsp",
|
|
56
|
+
"watch": "tsp compile main.tsp --watch",
|
|
57
|
+
"format": "tsp format **/*.tsp",
|
|
58
|
+
"lint": "npm run build:emitters && tsp compile main.tsp --no-emit --warn-as-error",
|
|
59
|
+
"lint:public": "tsp compile index.tsp --no-emit --warn-as-error"
|
|
60
|
+
},
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"@typespec/compiler": "^1.13.0 || >=1.13.0-dev.0"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@ancplua/typespec-emit-csharp": "file:./emitters/csharp",
|
|
66
|
+
"@ancplua/typespec-emit-ts-types": "file:./emitters/ts-types",
|
|
67
|
+
"@ancplua/typespec-otel-semconv": "1.41.0-2",
|
|
68
|
+
"@ancplua/typespec-otelconventions-lint": "file:./emitters/otelconventions-lint",
|
|
69
|
+
"@types/node": "25.9.4",
|
|
70
|
+
"@typespec/compiler": "1.13.0",
|
|
71
|
+
"@typespec/events": "0.83.0",
|
|
72
|
+
"@typespec/http": "1.13.0",
|
|
73
|
+
"@typespec/json-schema": "1.13.0",
|
|
74
|
+
"@typespec/openapi": "1.13.0",
|
|
75
|
+
"@typespec/openapi3": "1.13.0",
|
|
76
|
+
"@typespec/rest": "0.83.0",
|
|
77
|
+
"@typespec/sse": "0.83.0",
|
|
78
|
+
"@typespec/streams": "0.83.0",
|
|
79
|
+
"@typespec/versioning": "0.83.0",
|
|
80
|
+
"typescript": "6.0.3",
|
|
81
|
+
"vitest": "4.1.9",
|
|
82
|
+
"@qyl/telemetry-control-graph": "file:./emitters/telemetry-control-graph"
|
|
83
|
+
},
|
|
84
|
+
"dependencies": {
|
|
85
|
+
"@azure-tools/typespec-azure-core": "^0.69.0",
|
|
86
|
+
"@typespec/xml": "^0.83.0"
|
|
87
|
+
}
|
|
88
|
+
}
|
package/tspconfig.yaml
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# qyl-api-schema TypeSpec configuration.
|
|
2
|
+
# This repo is a contract source, not a server implementation. It emits schema
|
|
3
|
+
# and DTO artifacts only; qyl owns runtime services and physical storage schemas.
|
|
4
|
+
|
|
5
|
+
emit:
|
|
6
|
+
- "@qyl/telemetry-control-graph"
|
|
7
|
+
- "@ancplua/typespec-emit-csharp"
|
|
8
|
+
- "@ancplua/typespec-emit-ts-types"
|
|
9
|
+
- "@typespec/openapi3"
|
|
10
|
+
- "@typespec/json-schema"
|
|
11
|
+
|
|
12
|
+
options:
|
|
13
|
+
"@qyl/telemetry-control-graph":
|
|
14
|
+
emitter-output-dir: "{project-root}/generated/control-graph"
|
|
15
|
+
file-types:
|
|
16
|
+
- json
|
|
17
|
+
- yaml
|
|
18
|
+
include-schema: true
|
|
19
|
+
include-conformance-plan: true
|
|
20
|
+
include-report: true
|
|
21
|
+
|
|
22
|
+
"@ancplua/typespec-emit-csharp":
|
|
23
|
+
emitter-output-dir: "{project-root}/generated/contracts"
|
|
24
|
+
|
|
25
|
+
"@ancplua/typespec-emit-ts-types":
|
|
26
|
+
emitter-output-dir: "{project-root}/generated/ts-types"
|
|
27
|
+
|
|
28
|
+
"@typespec/openapi3":
|
|
29
|
+
emitter-output-dir: "{project-root}/generated/openapi"
|
|
30
|
+
output-file: "qyl.openapi.json"
|
|
31
|
+
file-type: json
|
|
32
|
+
openapi-versions:
|
|
33
|
+
- "3.2.0"
|
|
34
|
+
omit-unreachable-types: true
|
|
35
|
+
operation-id-strategy: parent-container
|
|
36
|
+
|
|
37
|
+
"@typespec/json-schema":
|
|
38
|
+
emitter-output-dir: "{project-root}/generated/json-schema"
|
|
39
|
+
file-type: json
|
|
40
|
+
bundleId: qyl-api-schema
|
|
41
|
+
|
|
42
|
+
linter:
|
|
43
|
+
extends:
|
|
44
|
+
- "@typespec/http/all"
|
|
45
|
+
- "@ancplua/typespec-otelconventions-lint/recommended"
|
|
46
|
+
enable:
|
|
47
|
+
"@ancplua/typespec-otelconventions-lint/graph-attribute-key":
|
|
48
|
+
pattern: "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)+$"
|
|
49
|
+
allowedRoots: ["qyl", "ancplua"]
|