space.highport.manage.getSiteTraffic
Schema Diff
+63 -0
Compatibility Analysis
Breaking Changes Detected
5 breaking changes, 15 non-breaking changes.
Breaking Changes (5)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals", src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.requests", kind: "prop", name: Some("requests") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen", kind: "prop", name: Some("firstSeen") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.requests", kind: "prop", name: Some("requests") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled", kind: "prop", name: Some("bytesBilled") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.recordCid", kind: "prop", name: Some("recordCid") }
Non-Breaking Changes (15)
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.recordCid" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.requests" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes" }
- AddedVertex AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.requests" }
- AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.records", kind: "prop", name: Some("records") }
- AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.refusals", kind: "prop", name: Some("refusals") }
- AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records", tgt: "space.highport.manage.getSiteTraffic:output.records:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen", kind: "prop", name: Some("lastSeen") }
- AddedEdge AddedEdge { src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes", kind: "prop", name: Some("estimatedBytes") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.recordCid" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items.requests" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes" }AddedVertex { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals.requests" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.firstSeen", kind: "prop", name: Some("firstSeen") }
- Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.requests", kind: "prop", name: Some("requests") }
- Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.bytesBilled", kind: "prop", name: Some("bytesBilled") }
- Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.records:items", src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.recordCid", kind: "prop", name: Some("recordCid") }
- Breaking: RequiredEdgeAdded { vertex_id: "space.highport.manage.getSiteTraffic:output.refusals", src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.requests", kind: "prop", name: Some("requests") }
- Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.records", kind: "prop", name: Some("records") }
- Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output", tgt: "space.highport.manage.getSiteTraffic:output.refusals", kind: "prop", name: Some("refusals") }
- Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records", tgt: "space.highport.manage.getSiteTraffic:output.records:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output.records:items", tgt: "space.highport.manage.getSiteTraffic:output.records:items.lastSeen", kind: "prop", name: Some("lastSeen") }
- Non-breaking: AddedEdge { src: "space.highport.manage.getSiteTraffic:output.refusals", tgt: "space.highport.manage.getSiteTraffic:output.refusals.estimatedBytes", kind: "prop", name: Some("estimatedBytes") }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"main": {
5
5
"description": "Traffic to one domain the caller owns, over a range: requests and bytes per hour, the busiest paths, and the status mix. Byte figures include a flat per-response header estimate, because the edge's access log records the response body only.",
6
6
"errors": [
7
7
{
8
8
"description": "Not a syntactically valid, non-reserved, public-suffix-safe domain. Distinct from DomainNotFound: the string is not a hostname at all.",
9
9
"name": "InvalidDomain"
10
10
},
11
11
{
12
12
"description": "No such domain, or it is not registered to the calling identity. The two are one answer so the method is not an existence oracle.",
13
13
"name": "DomainNotFound"
14
14
},
15
15
{
16
16
"description": "This deployment has no analytics store configured, so no traffic was ever recorded.",
17
17
"name": "AnalyticsDisabled"
18
18
}
19
19
],
20
20
"output": {
21
21
"encoding": "application/json",
22
22
"schema": {
23
23
"properties": {
24
24
"buckets": {
25
25
"description": "Hourly buckets, oldest first.",
26
26
"items": {
27
27
"description": "One hour of a domain's traffic.",
28
28
"properties": {
29
29
"bucket": {
30
30
"description": "The hour this bucket starts.",
31
31
"format": "datetime",
32
32
"type": "string"
33
33
},
34
34
"bytesBilled": {
35
35
"description": "Body bytes plus the per-response header estimate.",
36
36
"type": "integer"
37
37
},
38
38
"bytesBody": {
39
39
"description": "Response body bytes, as the edge logged them.",
40
40
"type": "integer"
41
41
},
42
42
"requests": {
43
43
"description": "Responses in the hour.",
44
44
"type": "integer"
45
45
}
46
46
},
47
47
"required": [
48
48
"bucket",
49
49
"requests",
50
50
"bytesBody",
51
51
"bytesBilled"
52
52
],
53
53
"type": "object"
54
54
},
55
55
"type": "array"
56
56
},
57
57
"bytesBilled": {
58
58
"description": "Total billed bytes over the range.",
59
59
"type": "integer"
60
60
},
61
61
"bytesBilledToVisitors": {
62
62
"description": "How much of bytesBilled an authenticated visitor paid for rather than the owner. Zero unless the domain is on the sender-pays policy.",
63
63
"type": "integer"
64
64
},
65
65
"domain": {
66
66
"type": "string"
67
67
},
68
68
"headerEstimateBytes": {
69
69
"description": "The flat per-response constant added to every logged body size. Every byte figure here is an estimate by this much per response.",
70
70
"type": "integer"
71
71
},
72
+
"records": {
73
+
"description": "Which published version of the site record served the traffic, heaviest first. Bounded by topRecords, so a domain republished more often than that has versions this does not list. Absent from a deployment that does not report the split.",
74
+
"items": {
75
+
"description": "One published version, and the traffic the snapshots built from it served.",
76
+
"properties": {
77
+
"bytesBilled": {
78
+
"description": "Billed bytes.",
79
+
"type": "integer"
80
+
},
81
+
"firstSeen": {
82
+
"description": "The first response inside the range served from this version.",
83
+
"format": "datetime",
84
+
"type": "string"
85
+
},
86
+
"lastSeen": {
87
+
"description": "The last, which with firstSeen is how long the version was serving inside the range — what makes one version's byte figure comparable to another's. Absent where the answer is not known, which a reader shows as still serving rather than as an interval it was not given.",
88
+
"format": "datetime",
89
+
"type": "string"
90
+
},
91
+
"recordCid": {
92
+
"description": "The site record the serving snapshot was built from. Every response already names it, so the split needs nothing tagged.",
93
+
"format": "cid",
94
+
"type": "string"
95
+
},
96
+
"requests": {
97
+
"description": "Responses.",
98
+
"type": "integer"
99
+
}
100
+
},
101
+
"required": [
102
+
"recordCid",
103
+
"firstSeen",
104
+
"requests",
105
+
"bytesBilled"
106
+
],
107
+
"type": "object"
108
+
},
109
+
"type": "array"
110
+
},
111
+
"refusals": {
112
+
"description": "What the bandwidth allowance refused over the range, and what serving it would have cost. Absent from a deployment that does not report it.",
113
+
"properties": {
114
+
"estimatedBytes": {
115
+
"description": "What serving those responses instead would have charged the owner. Absent unless the deployment records it: a refusal transferred no body, so its cost is in no logged size, and only the edge knows how large the path it refused would have been.",
116
+
"type": "integer"
117
+
},
118
+
"requests": {
119
+
"description": "Responses refused because the payer's allowance for the period was spent. The same responses the status mix counts as 402, taken from the same read so the two figures cannot disagree.",
120
+
"type": "integer"
121
+
}
122
+
},
123
+
"required": [
124
+
"requests"
125
+
],
126
+
"type": "object"
127
+
},
72
128
"statuses": {
73
129
"description": "The status mix, with the crawler share alongside it.",
74
130
"items": {
75
131
"description": "One status code's share of the requests and of the bytes.",
76
132
"properties": {
77
133
"botRequests": {
78
134
"description": "How many of those came from a client classified as a crawler. Crawler traffic is billed, because it is real egress and the alternative rewards user-agent spoofing.",
79
135
"type": "integer"
80
136
},
81
137
"bytesBilled": {
82
138
"description": "Billed bytes.",
83
139
"type": "integer"
84
140
},
85
141
"requests": {
86
142
"description": "Responses with this status.",
87
143
"type": "integer"
88
144
},
89
145
"status": {
90
146
"description": "The HTTP status.",
91
147
"type": "integer"
92
148
}
93
149
},
94
150
"required": [
95
151
"status",
96
152
"requests",
97
153
"bytesBilled",
98
154
"botRequests"
99
155
],
100
156
"type": "object"
101
157
},
102
158
"type": "array"
103
159
},
104
160
"topPaths": {
105
161
"description": "The busiest paths over the range.",
106
162
"items": {
107
163
"description": "One path and what it cost.",
108
164
"properties": {
109
165
"bytesBilled": {
110
166
"description": "Billed bytes.",
111
167
"type": "integer"
112
168
},
113
169
"path": {
114
170
"description": "The request path.",
115
171
"type": "string"
116
172
},
117
173
"requests": {
118
174
"description": "Responses.",
119
175
"type": "integer"
120
176
}
121
177
},
122
178
"required": [
123
179
"path",
124
180
"requests",
125
181
"bytesBilled"
126
182
],
127
183
"type": "object"
128
184
},
129
185
"type": "array"
130
186
}
131
187
},
132
188
"required": [
133
189
"domain",
134
190
"bytesBilled",
135
191
"bytesBilledToVisitors",
136
192
"headerEstimateBytes",
137
193
"buckets",
138
194
"topPaths",
139
195
"statuses"
140
196
],
141
197
"type": "object"
142
198
}
143
199
},
144
200
"parameters": {
145
201
"properties": {
146
202
"domain": {
147
203
"description": "The registered hostname. Must be registered to the calling identity.",
148
204
"maxLength": 253,
149
205
"type": "string"
150
206
},
151
207
"from": {
152
208
"description": "Inclusive lower bound. Defaults to 30 days ago.",
153
209
"format": "datetime",
154
210
"type": "string"
155
211
},
156
212
"to": {
157
213
"description": "Exclusive upper bound. Defaults to now.",
158
214
"format": "datetime",
159
215
"type": "string"
160
216
},
161
217
"topPaths": {
162
218
"default": 20,
163
219
"description": "How many of the busiest paths to return.",
164
220
"maximum": 100,
165
221
"minimum": 0,
166
222
"type": "integer"
223
+
},
224
+
"topRecords": {
225
+
"default": 20,
226
+
"description": "How many published record versions to return. A record CID is not a small set: a domain republished often has one per publish, so this is a top-N and not the whole history.",
227
+
"maximum": 100,
228
+
"minimum": 0,
229
+
"type": "integer"
167
230
}
168
231
},
169
232
"required": [
170
233
"domain"
171
234
],
172
235
"type": "params"
173
236
},
174
237
"type": "query"
175
238
}
176
239
},
177
240
"id": "space.highport.manage.getSiteTraffic",
178
241
"lexicon": 1
179
242
}