diff --git a/.speakeasy/logs/changes/changes.html b/.speakeasy/logs/changes/changes.html index 52f7afd7b..aa793552c 100644 --- a/.speakeasy/logs/changes/changes.html +++ b/.speakeasy/logs/changes/changes.html @@ -98,55 +98,22 @@

Typescript SDK Changes:

\ No newline at end of file diff --git a/.speakeasy/logs/changes/changes.md b/.speakeasy/logs/changes/changes.md index 1ffd95e0e..fe17d4160 100644 --- a/.speakeasy/logs/changes/changes.md +++ b/.speakeasy/logs/changes/changes.md @@ -1,38 +1,11 @@ ## Typescript SDK Changes: -* `outpost.configuration.getManagedConfig()`: `response` **Changed** - - `destinationsWebhookCompatHeaders` **Added** - - `destinationsWebhookCompatSignatureAlgorithm` **Added** - - `destinationsWebhookCompatSignatureContentTemplate` **Added** - - `destinationsWebhookCompatSignatureEncoding` **Added** - - `destinationsWebhookCompatSignatureHeaderName` **Added** - - `destinationsWebhookCompatSignatureHeaderTemplate` **Added** - - `destinationsWebhookCompatSignatureSecretEncoding` **Added** - - `destinationsWebhookCompatSignatureSecretPrefix` **Added** - - `destinationsWebhookSignatureSecretEncoding` **Added** - - `destinationsWebhookSignatureSecretPrefix` **Added** - - `destinationsWebhookTimestampFormat` **Added** -* `outpost.configuration.updateManagedConfig()`: - * `request` **Changed** - - `destinationsWebhookCompatHeaders` **Added** - - `destinationsWebhookCompatSignatureAlgorithm` **Added** - - `destinationsWebhookCompatSignatureContentTemplate` **Added** - - `destinationsWebhookCompatSignatureEncoding` **Added** - - `destinationsWebhookCompatSignatureHeaderName` **Added** - - `destinationsWebhookCompatSignatureHeaderTemplate` **Added** - - `destinationsWebhookCompatSignatureSecretEncoding` **Added** - - `destinationsWebhookCompatSignatureSecretPrefix` **Added** - - `destinationsWebhookSignatureSecretEncoding` **Added** - - `destinationsWebhookSignatureSecretPrefix` **Added** - - `destinationsWebhookTimestampFormat` **Added** - * `response` **Changed** - - `destinationsWebhookCompatHeaders` **Added** - - `destinationsWebhookCompatSignatureAlgorithm` **Added** - - `destinationsWebhookCompatSignatureContentTemplate` **Added** - - `destinationsWebhookCompatSignatureEncoding` **Added** - - `destinationsWebhookCompatSignatureHeaderName` **Added** - - `destinationsWebhookCompatSignatureHeaderTemplate` **Added** - - `destinationsWebhookCompatSignatureSecretEncoding` **Added** - - `destinationsWebhookCompatSignatureSecretPrefix` **Added** - - `destinationsWebhookSignatureSecretEncoding` **Added** - - `destinationsWebhookSignatureSecretPrefix` **Added** - - `destinationsWebhookTimestampFormat` **Added** +* `outpost.metrics.getAttemptMetrics()`: + * `request.measures` **Changed** (Breaking ⚠️) + - `union("count","successful_count" and 13 more)` **Added** + - `union("count","successful_count" and 9 more)` **Removed** (Breaking ⚠️) + - `union(Array<"count","successful_count" and 13 more>)` **Added** + - `union(Array<"count","successful_count" and 9 more>)` **Removed** (Breaking ⚠️) +* `outpost.attempts.list()`: `response.models[].latencyMs` **Added** +* `outpost.attempts.get()`: `response.latencyMs` **Added** +* `outpost.destinations.listAttempts()`: `response.models[].latencyMs` **Added** +* `outpost.destinations.getAttempt()`: `response.latencyMs` **Added** diff --git a/.speakeasy/logs/changes/new.openapi.yaml b/.speakeasy/logs/changes/new.openapi.yaml index 923363312..eb6d8a126 100644 --- a/.speakeasy/logs/changes/new.openapi.yaml +++ b/.speakeasy/logs/changes/new.openapi.yaml @@ -2562,6 +2562,11 @@ components: type: boolean description: Whether this attempt was manually triggered (e.g., a retry initiated by a user). example: false + latency_ms: + type: integer + nullable: true + description: Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked. + example: 212 event_id: type: string description: The ID of the associated event. @@ -3872,6 +3877,7 @@ paths: time: "2024-01-01T00:00:05Z" code: "200" attempt_number: 1 + latency_ms: 212 event_id: "evt_123" destination_id: "des_456" - id: "att_124" @@ -3879,6 +3885,7 @@ paths: time: "2024-01-02T10:00:01Z" code: "503" attempt_number: 2 + latency_ms: 1502 event_id: "evt_789" destination_id: "des_789" AdminAttemptsWithIncludeExample: @@ -3896,6 +3903,7 @@ paths: time: "2024-01-01T00:00:05Z" code: "200" attempt_number: 1 + latency_ms: 212 event_id: "evt_123" destination_id: "des_456" event: @@ -3965,6 +3973,7 @@ paths: time: "2024-01-01T00:00:05Z" code: "200" attempt_number: 1 + latency_ms: 212 event_id: "evt_123" destination_id: "des_456" AttemptWithIncludeExample: @@ -3979,6 +3988,7 @@ paths: body: '{"status":"ok"}' headers: {"content-type": "application/json"} attempt_number: 1 + latency_ms: 212 event_id: "evt_123" destination_id: "des_456" event: @@ -4562,6 +4572,7 @@ paths: time: "2024-01-01T00:00:05Z" code: "200" attempt_number: 1 + latency_ms: 212 event_id: "evt_123" destination_id: "des_456" - id: "atm_124" @@ -4569,6 +4580,7 @@ paths: time: "2024-01-02T10:00:01Z" code: "503" attempt_number: 2 + latency_ms: 1502 event_id: "evt_789" destination_id: "des_456" "401": @@ -4634,6 +4646,7 @@ paths: time: "2024-01-01T00:00:05Z" code: "200" attempt_number: 1 + latency_ms: 212 event_id: "evt_123" destination_id: "des_456" "401": @@ -5156,7 +5169,11 @@ paths: **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, - `rate`, `successful_rate`, `failed_rate` + `rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + + Latency measures are in milliseconds and computed over attempts that recorded a + latency (see `latency_ms` on the attempt object). They are `null` for a bucket + with no such attempts, rather than `0`. **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` @@ -5201,13 +5218,13 @@ paths: schema: oneOf: - type: string - enum: [count, successful_count, failed_count, error_rate, first_attempt_count, retry_count, manual_retry_count, avg_attempt_number, rate, successful_rate, failed_rate] + enum: [count, successful_count, failed_count, error_rate, first_attempt_count, retry_count, manual_retry_count, avg_attempt_number, rate, successful_rate, failed_rate, avg_latency, p50_latency, p95_latency, p99_latency] - type: array items: type: string - enum: [count, successful_count, failed_count, error_rate, first_attempt_count, retry_count, manual_retry_count, avg_attempt_number, rate, successful_rate, failed_rate] - description: Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). - example: ["count", "error_rate"] + enum: [count, successful_count, failed_count, error_rate, first_attempt_count, retry_count, manual_retry_count, avg_attempt_number, rate, successful_rate, failed_rate, avg_latency, p50_latency, p95_latency, p99_latency] + description: Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). + example: ["count", "error_rate", "p95_latency"] - name: dimensions in: query required: false @@ -5318,6 +5335,8 @@ paths: successful_count: 1393 failed_count: 30 error_rate: 0.0211 + avg_latency: 212.4 + p95_latency: 810 metadata: granularity: "1d" query_time_ms: 38 diff --git a/.speakeasy/logs/changes/old.openapi.yaml b/.speakeasy/logs/changes/old.openapi.yaml index 74e14f4ef..b6ab65812 100644 --- a/.speakeasy/logs/changes/old.openapi.yaml +++ b/.speakeasy/logs/changes/old.openapi.yaml @@ -2873,6 +2873,38 @@ components: type: string DESTINATIONS_INCLUDE_MILLISECOND_TIMESTAMP: type: string + DESTINATIONS_WEBHOOK_COMPAT_HEADERS: + type: string + description: >- + Additional headers sent with the compat signature, as comma-separated "name=template" pairs. Available variables: {{.EventID}}, {{.Topic}}, {{.Timestamp}}. Use "\," for a literal comma in a template. + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_ALGORITHM: + type: string + description: >- + Algorithm for the compat signature. Defaults to "hmac-sha256". + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_CONTENT_TEMPLATE: + type: string + description: >- + Go template for the content signed by the compat signature. Same variables as DESTINATIONS_WEBHOOK_SIGNATURE_CONTENT_TEMPLATE. Defaults to "{{.Body}}". + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_ENCODING: + type: string + description: >- + Encoding for the compat signature ("hex" or "base64"). Defaults to "hex". + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_HEADER_NAME: + type: string + description: >- + Complete name of the compat signature header. Setting it sends a second signature, in a previous scheme, alongside the primary one. + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_HEADER_TEMPLATE: + type: string + description: >- + Go template for the value of the compat signature header. Same variables as DESTINATIONS_WEBHOOK_SIGNATURE_HEADER_TEMPLATE. Defaults to "v0={{.Signatures | join ","}}". + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_SECRET_ENCODING: + type: string + description: >- + How the compat signature derives its HMAC key from the destination secret: "raw", "base64" or "hex". Defaults to "raw". A destination whose secret can't be decoded doesn't receive the compat signature. + DESTINATIONS_WEBHOOK_COMPAT_SIGNATURE_SECRET_PREFIX: + type: string + description: >- + Prefix stripped from the destination secret before decoding for the compat signature (e.g., "whsec_"). DESTINATIONS_WEBHOOK_EVENT_ID_HEADER_NAME: type: string description: >- @@ -2895,8 +2927,20 @@ components: Complete name of the signature header. Unset uses the default "signature"; an explicit value pins that exact name; an empty string disables the header. Only applies to "default" mode. DESTINATIONS_WEBHOOK_SIGNATURE_HEADER_TEMPLATE: type: string + DESTINATIONS_WEBHOOK_SIGNATURE_SECRET_ENCODING: + type: string + description: >- + How the signature derives its HMAC key from the destination secret: "raw" uses the secret as-is, "base64" and "hex" decode it. Defaults to "raw". DESTINATIONS_WEBHOOK_SIGNING_SECRET_TEMPLATE must generate secrets this encoding can decode. Only applies to "default" mode. + DESTINATIONS_WEBHOOK_SIGNATURE_SECRET_PREFIX: + type: string + description: >- + Prefix stripped from the destination secret before decoding (e.g., "whsec_"). Ignored when DESTINATIONS_WEBHOOK_SIGNATURE_SECRET_ENCODING is "raw". Only applies to "default" mode. DESTINATIONS_WEBHOOK_SIGNING_SECRET_TEMPLATE: type: string + DESTINATIONS_WEBHOOK_TIMESTAMP_FORMAT: + type: string + description: >- + Format of the timestamp header: "rfc3339" or "unix". Defaults to "rfc3339". Only applies to "default" mode. DESTINATIONS_WEBHOOK_TIMESTAMP_HEADER_NAME: type: string description: >- diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 3a2713dbc..bd296e752 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,22 +2,22 @@ speakeasyVersion: 1.798.0 sources: Outpost API: sourceNamespace: outpost-api - sourceRevisionDigest: sha256:8b08afefc637dc16f26e8f0ba521f45d487750010e3ac8617f8120c8250d08aa - sourceBlobDigest: sha256:591df5e66037727eb55e1f0db346e716fefb9e7a380984210b8daba94877bb9a + sourceRevisionDigest: sha256:6ca6364aa25cf8b60d966d10eab9c17f4ac07fb9e1d1505bade22a9a6d21e3b6 + sourceBlobDigest: sha256:4b89650d9a4e9055a1919af1da6b166565e6fb38b30b40d4e67d8e678235a404 tags: - latest - 0.0.1 Outpost API (Go): sourceNamespace: outpost-api - sourceRevisionDigest: sha256:9c712c9651c20d79266573ec51a0e4f3bb5586e042ff06a69c0ba04767ed9e75 - sourceBlobDigest: sha256:73b00be62de6134e4c3a239079f0cabb02de0a8c743fd7ee5cc4450c160170cc + sourceRevisionDigest: sha256:a6258a8e1b11dc5b329631db99a30c4c770b574b990c271f0122fd4242277438 + sourceBlobDigest: sha256:bd7ed059a4dc706d6946d63c28bca8811be7f9de7b0f765c3c2dffd7b707faa5 tags: - latest - 0.0.1 Outpost API (Python): sourceNamespace: outpost-api - sourceRevisionDigest: sha256:ef4fc14aa44a05f7631da1917456c6e3a3687e61e314ca78282e96f3fd81340a - sourceBlobDigest: sha256:2676badfcb03d430bcb4352454d306b7cd14d26c3bc8d3a608888fb53a0bcb90 + sourceRevisionDigest: sha256:4ec8f0e85223ed736caf7c40ce7e993068272b15dddaa7ab7081bfdef799c762 + sourceBlobDigest: sha256:5552aab07de39527d3f9a2c5c4f0b7b836daa9206897c8b9ca7b70c5607d07b4 tags: - latest - 0.0.1 @@ -25,24 +25,24 @@ targets: outpost-go: source: Outpost API (Go) sourceNamespace: outpost-api - sourceRevisionDigest: sha256:9c712c9651c20d79266573ec51a0e4f3bb5586e042ff06a69c0ba04767ed9e75 - sourceBlobDigest: sha256:73b00be62de6134e4c3a239079f0cabb02de0a8c743fd7ee5cc4450c160170cc + sourceRevisionDigest: sha256:a6258a8e1b11dc5b329631db99a30c4c770b574b990c271f0122fd4242277438 + sourceBlobDigest: sha256:bd7ed059a4dc706d6946d63c28bca8811be7f9de7b0f765c3c2dffd7b707faa5 codeSamplesNamespace: outpost-api-go-code-samples - codeSamplesRevisionDigest: sha256:d6709b7348b63ca11c7f31f0962dd6a3f8562174d4bceb03d3480303896e7b97 + codeSamplesRevisionDigest: sha256:1c40eb17648805899a794de54698cd4e0f85aa416e0b14e028f6f374a57d6617 outpost-python: source: Outpost API (Python) sourceNamespace: outpost-api - sourceRevisionDigest: sha256:ef4fc14aa44a05f7631da1917456c6e3a3687e61e314ca78282e96f3fd81340a - sourceBlobDigest: sha256:2676badfcb03d430bcb4352454d306b7cd14d26c3bc8d3a608888fb53a0bcb90 + sourceRevisionDigest: sha256:4ec8f0e85223ed736caf7c40ce7e993068272b15dddaa7ab7081bfdef799c762 + sourceBlobDigest: sha256:5552aab07de39527d3f9a2c5c4f0b7b836daa9206897c8b9ca7b70c5607d07b4 codeSamplesNamespace: outpost-api-python-code-samples - codeSamplesRevisionDigest: sha256:cd41c767619784e7908d568dc285d026bf9aeb10e28226a843e07aa69ef0c91b + codeSamplesRevisionDigest: sha256:f673bcb4a986e9d216e59e485d532d9ef24c2fe53b07d15262153de4bbf42c6d outpost-ts: source: Outpost API sourceNamespace: outpost-api - sourceRevisionDigest: sha256:8b08afefc637dc16f26e8f0ba521f45d487750010e3ac8617f8120c8250d08aa - sourceBlobDigest: sha256:591df5e66037727eb55e1f0db346e716fefb9e7a380984210b8daba94877bb9a + sourceRevisionDigest: sha256:6ca6364aa25cf8b60d966d10eab9c17f4ac07fb9e1d1505bade22a9a6d21e3b6 + sourceBlobDigest: sha256:4b89650d9a4e9055a1919af1da6b166565e6fb38b30b40d4e67d8e678235a404 codeSamplesNamespace: outpost-api-typescript-code-samples - codeSamplesRevisionDigest: sha256:15fab6f2424fad73bb84c1b93c85fd5f4c5c448ef9191f7a5d54d455c7e7fc62 + codeSamplesRevisionDigest: sha256:5e78d900ac6d9f9eff1ef5d1dfdd2af4a5f54c6d3e4beabeff52ab959ba2a88c workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/examples/docker-compose/compose.yml b/examples/docker-compose/compose.yml index 2b7c35ad3..3074c0737 100644 --- a/examples/docker-compose/compose.yml +++ b/examples/docker-compose/compose.yml @@ -1,7 +1,7 @@ name: outpost-example services: migrate: - image: hookdeck/outpost:v1.4.1 + image: hookdeck/outpost:v1.5.0 command: migrate apply --yes env_file: .env depends_on: @@ -10,7 +10,7 @@ services: restart: "no" api: - image: hookdeck/outpost:v1.4.1 + image: hookdeck/outpost:v1.5.0 env_file: .env depends_on: migrate: @@ -25,7 +25,7 @@ services: - 3333:3333 delivery: - image: hookdeck/outpost:v1.4.1 + image: hookdeck/outpost:v1.5.0 env_file: .env depends_on: migrate: @@ -38,7 +38,7 @@ services: SERVICE: delivery log: - image: hookdeck/outpost:v1.4.1 + image: hookdeck/outpost:v1.5.0 env_file: .env depends_on: migrate: diff --git a/sdks/outpost-go/.speakeasy/gen.lock b/sdks/outpost-go/.speakeasy/gen.lock index cbf0aadc8..d236dd5cb 100644 --- a/sdks/outpost-go/.speakeasy/gen.lock +++ b/sdks/outpost-go/.speakeasy/gen.lock @@ -1,19 +1,19 @@ lockVersion: 2.0.0 id: f0627709-5a00-43ac-8678-ca716d6f379c management: - docChecksum: 6c3d30227dd26fc53cc3df8f5ccf770c + docChecksum: 1dcec59b1aae95cad33764a33914e30b docVersion: 0.0.1 speakeasyVersion: 1.798.0 generationVersion: 2.938.0 - releaseVersion: 1.6.0 - configChecksum: 8da19e6cd06a85b99a6109e1af2a865b + releaseVersion: 1.6.1 + configChecksum: 225ef3d4e8a423a1a092df3939472505 repoURL: https://github.com/hookdeck/outpost.git repoSubDirectory: sdks/outpost-go installationURL: https://github.com/hookdeck/outpost persistentEdits: - generation_id: 1fd96132-9d81-4b41-af10-cafee75a0b18 - pristine_commit_hash: 4e61c674ad0241fe93458cea46bd97fcc5241dc8 - pristine_tree_hash: 48bb454c58dd2554c696325360f6bb4b270e502f + generation_id: 09d8f2a8-dcd9-49c1-9e8a-7292eff29fb6 + pristine_commit_hash: ae10d7b47164f3349ac596616be266307b7fd894 + pristine_tree_hash: fa418a06f7c037debf792b1790c2094b423ddefd features: go: additionalDependencies: 0.1.0 @@ -94,8 +94,8 @@ trackedFiles: pristine_git_object: 71ddaa3bff7c43aa01c16c3b89c30ab09e66f732 docs/models/components/attempt.md: id: 830868ab1006 - last_write_checksum: sha1:52c12e4038ca066af9e4394f7c12f35cffe5361d - pristine_git_object: f25290d6bb660215c1cfb8fdc714f7435061475e + last_write_checksum: sha1:9caccdf9d3c71a08dfaf401052718701f695ed12 + pristine_git_object: 320bf98b78b1ba9af98f259ff4071dc0570deaa3 docs/models/components/attemptpaginatedresult.md: id: 56e122fd3059 last_write_checksum: sha1:5582cd39fe8bd7132e966c73204f03674b7fa115 @@ -718,20 +718,20 @@ trackedFiles: pristine_git_object: 4f12ca072b0a8cee0b27359549a2471b1517581a docs/models/operations/getattemptmetricsmeasuresenum1.md: id: 4057a7c16751 - last_write_checksum: sha1:3610684ca16502e539a1aa8c15a8e32c16c2f116 - pristine_git_object: 089476203de0c31abdf5f33cfb816edf4df00d21 + last_write_checksum: sha1:971d557ac685f900d7698cde9e0fbf86ed3404a7 + pristine_git_object: efd56afd3a5253322d51671929e8706829357798 docs/models/operations/getattemptmetricsmeasuresenum2.md: id: dfe6f415e02b - last_write_checksum: sha1:f6779514e6b1700cffaf6ae7751fd8dbb8acd418 - pristine_git_object: 8453b07ef639178c259fd8dc88efdb9e292d1e85 + last_write_checksum: sha1:3ac16a1f4848e301c0ae2256fdbb01ac23b47470 + pristine_git_object: 0d0cb09500661be4cf50272533070da954734e0e docs/models/operations/getattemptmetricsmeasuresunion.md: id: 454f41df243f - last_write_checksum: sha1:ed3ad8b4a0f803216c9665c47d56ad156a95e2fd - pristine_git_object: 44cc67051a611770fbc03f4f2091ecee86e090da + last_write_checksum: sha1:f87b450424030ba0873aaad16ea87b520e9c5cc2 + pristine_git_object: cbfc49965c5955578cf76c888c09b4fcb15b5422 docs/models/operations/getattemptmetricsrequest.md: id: accc5c32f0c1 - last_write_checksum: sha1:00b13f004d8fffaf9b012800093088ac8bd97c0d - pristine_git_object: f28d7fce6ed7f48189fa4e266a673026fd76fad6 + last_write_checksum: sha1:e3fd8aefe59fa28c98ea74fbf6a9f54aae6be6ef + pristine_git_object: 9baf431005a6bcbbac94894b32f57666453883de docs/models/operations/getattemptmetricsresponse.md: id: 69295ef2ea44 last_write_checksum: sha1:765207f47455d5bae79f60ce273d7d110750d5e8 @@ -1026,8 +1026,8 @@ trackedFiles: pristine_git_object: e9712192ac75106a3f8306a70fe5257849ba310d docs/sdks/metrics/README.md: id: a8545d964e21 - last_write_checksum: sha1:f900c8f086e95bac77904cbb4fb06c3fa87aaa5a - pristine_git_object: 8affd3c29daba3f78810eb63597518d8e76e2bda + last_write_checksum: sha1:eb95d6a9abea17f8717850c4d6e8a7df0cf7c2f2 + pristine_git_object: 4b44662f72a49bfec564ae9f0a849b8699514a7a docs/sdks/outpost/README.md: id: f9b868668835 last_write_checksum: sha1:ac17e2449e507035258aca017b7f44802d476f1c @@ -1118,8 +1118,8 @@ trackedFiles: pristine_git_object: 72ca1538bf771e82f1d878c128796a4e93bf8e0e metrics.go: id: 9539b0d0fd18 - last_write_checksum: sha1:01fe1f09fa059a438b5d0d61776ece4a7a22fd4f - pristine_git_object: 6f01bb0e395aaaa6544afac15af6b67d2ef7a0e2 + last_write_checksum: sha1:45962a727c673c00848935a29e88281bd6fca325 + pristine_git_object: 2fbec457b07add64dfe6af7defd56a0c07a0fd9d models/apierrors/apierror.go: id: 4cecf27a5a54 last_write_checksum: sha1:e699d3325ea82ea2b0d29656396210f0513c3391 @@ -1158,8 +1158,8 @@ trackedFiles: pristine_git_object: 7a24725d255c9bb5620dcd8e128b1b9b4965469b models/components/attempt.go: id: f1a7ba25d0ee - last_write_checksum: sha1:bac7dbbbf8191ba66e2dcd967cbe4d5653ec2412 - pristine_git_object: 8af8aa4d47e92a0fab2e96b301ac34f5402fedd8 + last_write_checksum: sha1:6c170db6adc203c440c40e9b2d2037885f64fc4c + pristine_git_object: f44cde4dc4c4037ae9e29575e0d80be3a8b592d6 models/components/attemptpaginatedresult.go: id: 9540a56f5184 last_write_checksum: sha1:96a7782573d0d04417e8993960c363605500f0af @@ -1538,8 +1538,8 @@ trackedFiles: pristine_git_object: 9027959a7425677472a96e1a3ce4d7c7cdc7d79c models/operations/getattemptmetrics.go: id: 2cba7e6f3d47 - last_write_checksum: sha1:e9414012e8c83ece7ee0fded9c3ab908d2848c42 - pristine_git_object: 1407ab499998f7e9aae7c8a95869d7270c676852 + last_write_checksum: sha1:265dbdbd4f9a79458625caf0164be5e85175dc78 + pristine_git_object: 717f16fc3547a31ce917641542b0f8d4bbbe8e6a models/operations/getdestinationtypeschema.go: id: 469bb274efa3 last_write_checksum: sha1:96aae2a5d2c9603791e9786dafbb3a668e52ace2 @@ -1642,8 +1642,8 @@ trackedFiles: pristine_git_object: 50aa468688c05e04abd6c94a941d3b525e697ffa outpost.go: id: 7aebc57e3f81 - last_write_checksum: sha1:984d2075c00fbbce382bf40b44764e6bd62709a2 - pristine_git_object: 5e16ca3b277a194e9dba93993ba04ea633103198 + last_write_checksum: sha1:b2a216ea2915ee37d3b2546acd998e24d65a57e4 + pristine_git_object: de835bf05008b6e867e2dbce5dc9d6759d4d83c1 retry/config.go: id: 82d673cb0389 last_write_checksum: sha1:102d1953fbd7e9f312c4442c71ccca2eaaeaa27d @@ -2082,14 +2082,14 @@ examples: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"} AttemptWithIncludeExample: parameters: path: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "response_data": {"status_code": 200, "body": "{\"status\":\"ok\"}", "headers": {"content-type": "application/json"}}, "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}, "data": {"user_id": "userid", "status": "active"}}} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "response_data": {"status_code": 200, "body": "{\"status\":\"ok\"}", "headers": {"content-type": "application/json"}}, "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}, "data": {"user_id": "userid", "status": "active"}}} retryEvent: RetryAccepted: requestBody: @@ -2121,7 +2121,7 @@ examples: dir: "desc" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "atm_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "event_id": "evt_789", "destination_id": "des_456"}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "atm_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "latency_ms": 1502, "event_id": "evt_789", "destination_id": "des_456"}]} getTenantDestinationAttempt: DestinationAttemptExample: parameters: @@ -2131,7 +2131,7 @@ examples: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"} listDestinationTypeSchemas: DestinationTypesExample: responses: @@ -2157,7 +2157,7 @@ examples: destination_type: "webhook" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "att_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "event_id": "evt_789", "destination_id": "des_789"}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "att_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "latency_ms": 1502, "event_id": "evt_789", "destination_id": "des_789"}]} AdminAttemptsWithIncludeExample: parameters: query: @@ -2167,7 +2167,7 @@ examples: destination_type: "webhook" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}, "models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}, "models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}]} getEventMetrics: speakeasy-default-get-event-metrics: parameters: @@ -2206,7 +2206,7 @@ examples: time[start]: "2026-03-02T00:00:00Z" time[end]: "2026-03-03T00:00:00Z" granularity: "1h" - measures: ["count", "error_rate"] + measures: ["count", "error_rate", "p95_latency"] filters[destination_type]: "webhook" time: {"start": "2026-03-02T00:00:00Z", "end": "2026-03-03T00:00:00Z"} responses: @@ -2226,12 +2226,12 @@ examples: time[start]: "2026-03-02T00:00:00Z" time[end]: "2026-03-03T00:00:00Z" granularity: "1h" - measures: ["count", "error_rate"] + measures: ["count", "error_rate", "p95_latency"] filters[destination_type]: "webhook" time: {"start": "2026-03-02T00:00:00Z", "end": "2026-03-03T00:00:00Z"} responses: "200": - application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}} + application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211, "avg_latency": 212.4, "p95_latency": 810}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}} getManagedConfig: speakeasy-default-get-managed-config: responses: @@ -2258,7 +2258,7 @@ examples: application/json: {} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: "## Go SDK Changes:\n* `Outpost.Configuration.GetManagedConfig()`: `response` **Changed**\n* `Outpost.Configuration.UpdateManagedConfig()`: \n * `request.Request` **Changed**\n * `response` **Changed**\n" +releaseNotes: "## Go SDK Changes:\n* `Outpost.Metrics.GetAttemptMetrics()`: \n * `request.Request.Measures` **Changed** (Breaking ⚠️)\n* `Outpost.Attempts.List()`: `response.Models[].LatencyMs` **Added**\n* `Outpost.Attempts.Get()`: `response.LatencyMs` **Added**\n* `Outpost.Destinations.ListAttempts()`: `response.Models[].LatencyMs` **Added**\n* `Outpost.Destinations.GetAttempt()`: `response.LatencyMs` **Added**\n" generatedFiles: - .gitattributes - /models/apierrors/badrequesterror.go diff --git a/sdks/outpost-go/.speakeasy/gen.yaml b/sdks/outpost-go/.speakeasy/gen.yaml index 74b9ac673..0f70c5c98 100644 --- a/sdks/outpost-go/.speakeasy/gen.yaml +++ b/sdks/outpost-go/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false go: - version: 1.6.0 + version: 1.6.1 additionalDependencies: {} allowUnknownFieldsInWeakUnions: false baseErrorName: OutpostError diff --git a/sdks/outpost-go/RELEASES.md b/sdks/outpost-go/RELEASES.md index 1f46c532c..d67095cda 100644 --- a/sdks/outpost-go/RELEASES.md +++ b/sdks/outpost-go/RELEASES.md @@ -238,4 +238,14 @@ Based on: ### Generated - [go v1.6.0] sdks/outpost-go ### Releases -- [Go v1.6.0] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v1.6.0 - sdks/outpost-go \ No newline at end of file +- [Go v1.6.0] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v1.6.0 - sdks/outpost-go + +## 2026-09-23 17:57:44 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.798.0 (2.938.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [go v1.6.1] sdks/outpost-go +### Releases +- [Go v1.6.1] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v1.6.1 - sdks/outpost-go \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/attempt.md b/sdks/outpost-go/docs/models/components/attempt.md index f25290d6b..320bf98b7 100644 --- a/sdks/outpost-go/docs/models/components/attempt.md +++ b/sdks/outpost-go/docs/models/components/attempt.md @@ -5,17 +5,18 @@ An attempt represents a single delivery attempt of an event to a destination. ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -| `ID` | `*string` | :heavy_minus_sign: | Unique identifier for this attempt. | atm_123 | -| `TenantID` | `*string` | :heavy_minus_sign: | The tenant this attempt belongs to. | tnt_123 | -| `Status` | [*components.Status](../../models/components/status.md) | :heavy_minus_sign: | The attempt status. | success | -| `Time` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Time the attempt was made. | 2024-01-01T00:00:05Z | -| `Code` | `*string` | :heavy_minus_sign: | Response status code or error code. | 200 | -| `ResponseData` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Response data from the attempt. Only included when include=response_data. | {
"status_code": 200,
"body": "{\"status\":\"ok\"}",
"headers": {
"content-type": "application/json"
}
} | -| `AttemptNumber` | `*int64` | :heavy_minus_sign: | The attempt number (1 for first attempt, 2+ for retries). | 1 | -| `Manual` | `*bool` | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false | -| `EventID` | `*string` | :heavy_minus_sign: | The ID of the associated event. | evt_123 | -| `DestinationID` | `*string` | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 | -| `Event` | optionalnullable.OptionalNullable[[components.EventUnion](../../models/components/eventunion.md)] | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | | -| `Destination` | [*components.Destination](../../models/components/destination.md) | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | `*string` | :heavy_minus_sign: | Unique identifier for this attempt. | atm_123 | +| `TenantID` | `*string` | :heavy_minus_sign: | The tenant this attempt belongs to. | tnt_123 | +| `Status` | [*components.Status](../../models/components/status.md) | :heavy_minus_sign: | The attempt status. | success | +| `Time` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Time the attempt was made. | 2024-01-01T00:00:05Z | +| `Code` | `*string` | :heavy_minus_sign: | Response status code or error code. | 200 | +| `ResponseData` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Response data from the attempt. Only included when include=response_data. | {
"status_code": 200,
"body": "{\"status\":\"ok\"}",
"headers": {
"content-type": "application/json"
}
} | +| `AttemptNumber` | `*int64` | :heavy_minus_sign: | The attempt number (1 for first attempt, 2+ for retries). | 1 | +| `Manual` | `*bool` | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false | +| `LatencyMs` | optionalnullable.OptionalNullable[`int64`] | :heavy_minus_sign: | Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked. | 212 | +| `EventID` | `*string` | :heavy_minus_sign: | The ID of the associated event. | evt_123 | +| `DestinationID` | `*string` | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 | +| `Event` | optionalnullable.OptionalNullable[[components.EventUnion](../../models/components/eventunion.md)] | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | | +| `Destination` | [*components.Destination](../../models/components/destination.md) | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md index 089476203..efd56afd3 100644 --- a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md +++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md @@ -25,4 +25,8 @@ value := operations.GetAttemptMetricsMeasuresEnum1Count | `GetAttemptMetricsMeasuresEnum1AvgAttemptNumber` | avg_attempt_number | | `GetAttemptMetricsMeasuresEnum1Rate` | rate | | `GetAttemptMetricsMeasuresEnum1SuccessfulRate` | successful_rate | -| `GetAttemptMetricsMeasuresEnum1FailedRate` | failed_rate | \ No newline at end of file +| `GetAttemptMetricsMeasuresEnum1FailedRate` | failed_rate | +| `GetAttemptMetricsMeasuresEnum1AvgLatency` | avg_latency | +| `GetAttemptMetricsMeasuresEnum1P50Latency` | p50_latency | +| `GetAttemptMetricsMeasuresEnum1P95Latency` | p95_latency | +| `GetAttemptMetricsMeasuresEnum1P99Latency` | p99_latency | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md index 8453b07ef..0d0cb0950 100644 --- a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md +++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md @@ -25,4 +25,8 @@ value := operations.GetAttemptMetricsMeasuresEnum2Count | `GetAttemptMetricsMeasuresEnum2AvgAttemptNumber` | avg_attempt_number | | `GetAttemptMetricsMeasuresEnum2Rate` | rate | | `GetAttemptMetricsMeasuresEnum2SuccessfulRate` | successful_rate | -| `GetAttemptMetricsMeasuresEnum2FailedRate` | failed_rate | \ No newline at end of file +| `GetAttemptMetricsMeasuresEnum2FailedRate` | failed_rate | +| `GetAttemptMetricsMeasuresEnum2AvgLatency` | avg_latency | +| `GetAttemptMetricsMeasuresEnum2P50Latency` | p50_latency | +| `GetAttemptMetricsMeasuresEnum2P95Latency` | p95_latency | +| `GetAttemptMetricsMeasuresEnum2P99Latency` | p99_latency | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md index 44cc67051..cbfc49965 100644 --- a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md +++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md @@ -1,6 +1,6 @@ # GetAttemptMetricsMeasuresUnion -Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). +Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). ## Supported Types diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md index f28d7fce6..9baf43100 100644 --- a/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md +++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md @@ -3,17 +3,17 @@ ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Time` | [operations.GetAttemptMetricsTime](../../models/operations/getattemptmetricstime.md) | :heavy_check_mark: | Time range for the metrics query. | | -| `Granularity` | `*string` | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h | -| `Measures` | [operations.GetAttemptMetricsMeasuresUnion](../../models/operations/getattemptmetricsmeasuresunion.md) | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate"
] | -| `Dimensions` | [*operations.GetAttemptMetricsDimensionsUnion](../../models/operations/getattemptmetricsdimensionsunion.md) | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | | -| `FiltersDestinationID` | [*operations.GetAttemptMetricsFiltersDestinationID](../../models/operations/getattemptmetricsfiltersdestinationid.md) | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | | -| `FiltersDestinationType` | [*operations.FiltersDestinationType](../../models/operations/filtersdestinationtype.md) | :heavy_minus_sign: | Filter by destination type(s). Use bracket notation for multiple values (e.g., `filters[destination_type][0]=webhook&filters[destination_type][1]=aws_sqs`). | | -| `FiltersTopic` | [*operations.GetAttemptMetricsFiltersTopic](../../models/operations/getattemptmetricsfilterstopic.md) | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | | -| `FiltersStatus` | [*operations.FiltersStatus](../../models/operations/filtersstatus.md) | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | | -| `FiltersCode` | [*operations.FiltersCode](../../models/operations/filterscode.md) | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | | -| `FiltersManual` | [*operations.FiltersManual](../../models/operations/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | | -| `FiltersAttemptNumber` | [*operations.FiltersAttemptNumber](../../models/operations/filtersattemptnumber.md) | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | | -| `FiltersTenantID` | [*operations.GetAttemptMetricsFiltersTenantID](../../models/operations/getattemptmetricsfilterstenantid.md) | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Time` | [operations.GetAttemptMetricsTime](../../models/operations/getattemptmetricstime.md) | :heavy_check_mark: | Time range for the metrics query. | | +| `Granularity` | `*string` | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h | +| `Measures` | [operations.GetAttemptMetricsMeasuresUnion](../../models/operations/getattemptmetricsmeasuresunion.md) | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate",
"p95_latency"
] | +| `Dimensions` | [*operations.GetAttemptMetricsDimensionsUnion](../../models/operations/getattemptmetricsdimensionsunion.md) | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | | +| `FiltersDestinationID` | [*operations.GetAttemptMetricsFiltersDestinationID](../../models/operations/getattemptmetricsfiltersdestinationid.md) | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | | +| `FiltersDestinationType` | [*operations.FiltersDestinationType](../../models/operations/filtersdestinationtype.md) | :heavy_minus_sign: | Filter by destination type(s). Use bracket notation for multiple values (e.g., `filters[destination_type][0]=webhook&filters[destination_type][1]=aws_sqs`). | | +| `FiltersTopic` | [*operations.GetAttemptMetricsFiltersTopic](../../models/operations/getattemptmetricsfilterstopic.md) | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | | +| `FiltersStatus` | [*operations.FiltersStatus](../../models/operations/filtersstatus.md) | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | | +| `FiltersCode` | [*operations.FiltersCode](../../models/operations/filterscode.md) | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | | +| `FiltersManual` | [*operations.FiltersManual](../../models/operations/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | | +| `FiltersAttemptNumber` | [*operations.FiltersAttemptNumber](../../models/operations/filtersattemptnumber.md) | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | | +| `FiltersTenantID` | [*operations.GetAttemptMetricsFiltersTenantID](../../models/operations/getattemptmetricsfilterstenantid.md) | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | | \ No newline at end of file diff --git a/sdks/outpost-go/docs/sdks/metrics/README.md b/sdks/outpost-go/docs/sdks/metrics/README.md index 8affd3c29..4b44662f7 100644 --- a/sdks/outpost-go/docs/sdks/metrics/README.md +++ b/sdks/outpost-go/docs/sdks/metrics/README.md @@ -93,7 +93,11 @@ dimensional grouping, and filtering. **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, -`rate`, `successful_rate`, `failed_rate` +`rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + +Latency measures are in milliseconds and computed over attempts that recorded a +latency (see `latency_ms` on the attempt object). They are `null` for a bucket +with no such attempts, rather than `0`. **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` @@ -132,6 +136,7 @@ func main() { []operations.GetAttemptMetricsMeasuresEnum2{ operations.GetAttemptMetricsMeasuresEnum2Count, operations.GetAttemptMetricsMeasuresEnum2ErrorRate, + operations.GetAttemptMetricsMeasuresEnum2P95Latency, }, ), FiltersDestinationType: outpostgo.Pointer(operations.CreateFiltersDestinationTypeDestinationType( diff --git a/sdks/outpost-go/metrics.go b/sdks/outpost-go/metrics.go index 6f01bb0e3..2fbec457b 100644 --- a/sdks/outpost-go/metrics.go +++ b/sdks/outpost-go/metrics.go @@ -339,7 +339,11 @@ func (s *Metrics) GetEventMetrics(ctx context.Context, request operations.GetEve // // **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, // `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, -// `rate`, `successful_rate`, `failed_rate` +// `rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` +// +// Latency measures are in milliseconds and computed over attempts that recorded a +// latency (see `latency_ms` on the attempt object). They are `null` for a bucket +// with no such attempts, rather than `0`. // // **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` // diff --git a/sdks/outpost-go/models/components/attempt.go b/sdks/outpost-go/models/components/attempt.go index 8af8aa4d4..f44cde4dc 100644 --- a/sdks/outpost-go/models/components/attempt.go +++ b/sdks/outpost-go/models/components/attempt.go @@ -286,6 +286,8 @@ type Attempt struct { AttemptNumber *int64 `json:"attempt_number,omitempty"` // Whether this attempt was manually triggered (e.g., a retry initiated by a user). Manual *bool `json:"manual,omitempty"` + // Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked. + LatencyMs optionalnullable.OptionalNullable[int64] `json:"latency_ms,omitempty"` // The ID of the associated event. EventID *string `json:"event_id,omitempty"` // The destination ID this attempt was sent to. @@ -362,6 +364,13 @@ func (a *Attempt) GetManual() *bool { return a.Manual } +func (a *Attempt) GetLatencyMs() optionalnullable.OptionalNullable[int64] { + if a == nil { + return nil + } + return a.LatencyMs +} + func (a *Attempt) GetEventID() *string { if a == nil { return nil diff --git a/sdks/outpost-go/models/operations/getattemptmetrics.go b/sdks/outpost-go/models/operations/getattemptmetrics.go index 1407ab499..717f16fc3 100644 --- a/sdks/outpost-go/models/operations/getattemptmetrics.go +++ b/sdks/outpost-go/models/operations/getattemptmetrics.go @@ -58,6 +58,10 @@ const ( GetAttemptMetricsMeasuresEnum2Rate GetAttemptMetricsMeasuresEnum2 = "rate" GetAttemptMetricsMeasuresEnum2SuccessfulRate GetAttemptMetricsMeasuresEnum2 = "successful_rate" GetAttemptMetricsMeasuresEnum2FailedRate GetAttemptMetricsMeasuresEnum2 = "failed_rate" + GetAttemptMetricsMeasuresEnum2AvgLatency GetAttemptMetricsMeasuresEnum2 = "avg_latency" + GetAttemptMetricsMeasuresEnum2P50Latency GetAttemptMetricsMeasuresEnum2 = "p50_latency" + GetAttemptMetricsMeasuresEnum2P95Latency GetAttemptMetricsMeasuresEnum2 = "p95_latency" + GetAttemptMetricsMeasuresEnum2P99Latency GetAttemptMetricsMeasuresEnum2 = "p99_latency" ) func (e GetAttemptMetricsMeasuresEnum2) ToPointer() *GetAttemptMetricsMeasuresEnum2 { @@ -90,6 +94,14 @@ func (e *GetAttemptMetricsMeasuresEnum2) UnmarshalJSON(data []byte) error { case "successful_rate": fallthrough case "failed_rate": + fallthrough + case "avg_latency": + fallthrough + case "p50_latency": + fallthrough + case "p95_latency": + fallthrough + case "p99_latency": *e = GetAttemptMetricsMeasuresEnum2(v) return nil default: @@ -111,6 +123,10 @@ const ( GetAttemptMetricsMeasuresEnum1Rate GetAttemptMetricsMeasuresEnum1 = "rate" GetAttemptMetricsMeasuresEnum1SuccessfulRate GetAttemptMetricsMeasuresEnum1 = "successful_rate" GetAttemptMetricsMeasuresEnum1FailedRate GetAttemptMetricsMeasuresEnum1 = "failed_rate" + GetAttemptMetricsMeasuresEnum1AvgLatency GetAttemptMetricsMeasuresEnum1 = "avg_latency" + GetAttemptMetricsMeasuresEnum1P50Latency GetAttemptMetricsMeasuresEnum1 = "p50_latency" + GetAttemptMetricsMeasuresEnum1P95Latency GetAttemptMetricsMeasuresEnum1 = "p95_latency" + GetAttemptMetricsMeasuresEnum1P99Latency GetAttemptMetricsMeasuresEnum1 = "p99_latency" ) func (e GetAttemptMetricsMeasuresEnum1) ToPointer() *GetAttemptMetricsMeasuresEnum1 { @@ -143,6 +159,14 @@ func (e *GetAttemptMetricsMeasuresEnum1) UnmarshalJSON(data []byte) error { case "successful_rate": fallthrough case "failed_rate": + fallthrough + case "avg_latency": + fallthrough + case "p50_latency": + fallthrough + case "p95_latency": + fallthrough + case "p99_latency": *e = GetAttemptMetricsMeasuresEnum1(v) return nil default: @@ -157,7 +181,7 @@ const ( GetAttemptMetricsMeasuresUnionTypeArrayOfGetAttemptMetricsMeasuresEnum2 GetAttemptMetricsMeasuresUnionType = "arrayOfGetAttemptMetricsMeasuresEnum2" ) -// GetAttemptMetricsMeasuresUnion - Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). +// GetAttemptMetricsMeasuresUnion - Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). type GetAttemptMetricsMeasuresUnion struct { GetAttemptMetricsMeasuresEnum1 *GetAttemptMetricsMeasuresEnum1 `queryParam:"inline" union:"member"` ArrayOfGetAttemptMetricsMeasuresEnum2 []GetAttemptMetricsMeasuresEnum2 `queryParam:"inline" union:"member"` @@ -964,7 +988,7 @@ type GetAttemptMetricsRequest struct { // When omitted, returns a single aggregate row per dimension combination. // Granularity *string `queryParam:"style=form,explode=true,name=granularity"` - // Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). + // Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). Measures GetAttemptMetricsMeasuresUnion `queryParam:"style=form,explode=true,name=measures"` // Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). Dimensions *GetAttemptMetricsDimensionsUnion `queryParam:"style=form,explode=true,name=dimensions"` diff --git a/sdks/outpost-go/outpost.go b/sdks/outpost-go/outpost.go index 5e16ca3b2..de835bf05 100644 --- a/sdks/outpost-go/outpost.go +++ b/sdks/outpost-go/outpost.go @@ -172,10 +172,10 @@ func WithTimeout(timeout time.Duration) SDKOption { // New creates a new instance of the SDK with the provided options func New(opts ...SDKOption) *Outpost { sdk := &Outpost{ - SDKVersion: "1.6.0", + SDKVersion: "1.6.1", sdkConfiguration: config.SDKConfiguration{ - UserAgent: "speakeasy-sdk/go 1.6.0 2.938.0 0.0.1 github.com/hookdeck/outpost/sdks/outpost-go", - SDKVersion: "1.6.0", + UserAgent: "speakeasy-sdk/go 1.6.1 2.938.0 0.0.1 github.com/hookdeck/outpost/sdks/outpost-go", + SDKVersion: "1.6.1", GenVersion: "2.938.0", OpenAPIDocVersion: "0.0.1", ServerList: ServerList, diff --git a/sdks/outpost-go/shields.json b/sdks/outpost-go/shields.json index d90558941..d7fbc1f64 100644 --- a/sdks/outpost-go/shields.json +++ b/sdks/outpost-go/shields.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, "label": "outpost-go", - "message": "v1.6.0", + "message": "v1.6.1", "color": "blue" } diff --git a/sdks/outpost-python/.speakeasy/gen.lock b/sdks/outpost-python/.speakeasy/gen.lock index e733fad55..ed41ff77b 100644 --- a/sdks/outpost-python/.speakeasy/gen.lock +++ b/sdks/outpost-python/.speakeasy/gen.lock @@ -1,20 +1,20 @@ lockVersion: 2.0.0 id: da774284-22d9-4b6c-bb26-1c3fc9f2c7ee management: - docChecksum: bd65d445a7ac979a369bda81057a4c0b + docChecksum: fd9692b78f9ab29ed3e8868ebb7a7ee8 docVersion: 0.0.1 speakeasyVersion: 1.798.0 generationVersion: 2.938.0 - releaseVersion: 1.6.0 - configChecksum: cb9cd9395b66386f481b1eefa651ce21 + releaseVersion: 1.6.1 + configChecksum: d0e64c01ca6f91ebc7be1f61889a085e repoURL: https://github.com/hookdeck/outpost.git repoSubDirectory: sdks/outpost-python installationURL: https://github.com/hookdeck/outpost.git#subdirectory=sdks/outpost-python published: true persistentEdits: - generation_id: 51e72d29-d53e-402e-b837-be7b359205be - pristine_commit_hash: 7aff7114c8713611ee4048eb3b19204c6a0f17b5 - pristine_tree_hash: f1e1dd22ee5c9340da4c219b9d85f1eb922518b7 + generation_id: d9805d19-aa3b-47b7-b892-76e72772de13 + pristine_commit_hash: 94cf07f8ac5e079196de1117da4ca13b9298bfa3 + pristine_tree_hash: 270e354d07e84a7195fad57fc2f1293ba446a0a0 features: python: additionalDependencies: 1.1.0 @@ -87,8 +87,8 @@ trackedFiles: pristine_git_object: 09ac1d2ca6456ccec1ff23f1fdc849faee367687 docs/models/attempt.md: id: f7e36b022ef5 - last_write_checksum: sha1:81c03976613ecbc8a97e5f0e9883d9e4be829c06 - pristine_git_object: 4b5deb47e43e9fe89d5ab3d9a2b549ff5c0462eb + last_write_checksum: sha1:90930b6b347eeccbfe593ea867bee77226136a28 + pristine_git_object: 3472c4469a25cfbd078e0b3130e9f275c0c6faa8 docs/models/attemptpaginatedresult.md: id: fc54f8012629 last_write_checksum: sha1:6580c146171e2bb4936ff8c05db60edc59186264 @@ -519,20 +519,20 @@ trackedFiles: pristine_git_object: ddb69747067f4c315521f7fb59c85a532b695709 docs/models/getattemptmetricsmeasuresenum1.md: id: 8eeb3416346f - last_write_checksum: sha1:4a8d6e010105e9606f4072328131e2121d264264 - pristine_git_object: 80fadf55273907e32ce11b18b26d8707f83da609 + last_write_checksum: sha1:bf8f95f1eb62f2c05b9b9ce2e67bc893da8d3dc1 + pristine_git_object: f94a42e60777c2b8f26d54bc71de01cef0bf18df docs/models/getattemptmetricsmeasuresenum2.md: id: e8a6523879fc - last_write_checksum: sha1:485c5252334d3b8e92d37ea6ce94c883a9bd2adc - pristine_git_object: 6b523f6e1d189fabb131b6f511a10744e5d43719 + last_write_checksum: sha1:9cf2c5018da72d3625d02a86859ebb4cc8dbd969 + pristine_git_object: cdc965e8c791149c1d6427401c8d641da8925fb1 docs/models/getattemptmetricsmeasuresunion.md: id: 43ad71547aa3 - last_write_checksum: sha1:730bc2e9bd2b8e31336ffa3a2606b445690aea00 - pristine_git_object: 77494922eaa4188daac135809846ee5589d1fcdd + last_write_checksum: sha1:a48600764156ccd71f379dd1a955710789eccaff + pristine_git_object: 4eaf657b02b165677c89e404e61432d2f4b0d346 docs/models/getattemptmetricsrequest.md: id: 324bf98974db - last_write_checksum: sha1:b2317e6a13ed2c5d296ae37927213304279f1e22 - pristine_git_object: 0fd0ab809b490252acf32739d7bd6b584fedc8ba + last_write_checksum: sha1:b053456254c1ec947aca1991a29d2f455b3a659a + pristine_git_object: c7a10ae89a684a5d6fbc2452efd221cbcccd0019 docs/models/getattemptmetricstime.md: id: 74a7cb63bb89 last_write_checksum: sha1:00618199562bcf3f02abeae423c6997a96cc7612 @@ -963,8 +963,8 @@ trackedFiles: pristine_git_object: 5e43e4c70c8446bb4f83e223fe543571a0490e77 docs/sdks/metrics/README.md: id: a8545d964e21 - last_write_checksum: sha1:2069522ebc048627cc6f27ea73f4b405303c7584 - pristine_git_object: b1c1f206d91cf3a2209a68e851cce79e66d786a8 + last_write_checksum: sha1:e7618d9e84ce1d5dfb1b5384a12fa0d88d9e4988 + pristine_git_object: cc5c51c9edf58e60751adc7623b62f8ea6593943 docs/sdks/outpost/README.md: id: f9b868668835 last_write_checksum: sha1:eb80ce2b19909a1567949dbf37b72fba0fd6ac96 @@ -995,8 +995,8 @@ trackedFiles: pristine_git_object: cca330736fb6ecec666b32012a4c346570dd5085 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:1f62ddfca5500468855396f5c89a145144289bd1 - pristine_git_object: 456771de1f19d25fbac7ed8240d16dea464812c9 + last_write_checksum: sha1:037e65ea588e756b0fb472367a2da6b5b29edf61 + pristine_git_object: 59a423fe1d083e7237377f114221824aac26db8c scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:eb460f85c06b287fee629d997b2df75c92fa1cab @@ -1023,8 +1023,8 @@ trackedFiles: pristine_git_object: 5a1791665e43f993bd128bcb5dd3f883623dc2b6 src/outpost_sdk/_version.py: id: 22be68f35ad0 - last_write_checksum: sha1:7dccd71706913256423eca6c289b61bb2691f19c - pristine_git_object: 9e2b4340335d147a2cf1ca4b1ca835fee047d133 + last_write_checksum: sha1:9ebd2182e3736639414d8a6eb45dcc97d4191d88 + pristine_git_object: 9f058c8bbf6dd2ae231a63b07433101eb7e92ef5 src/outpost_sdk/attempts.py: id: 304ea4e0bbf1 last_write_checksum: sha1:9331f523ba2cc81a09dda669bc1a504d2a988162 @@ -1107,16 +1107,16 @@ trackedFiles: pristine_git_object: 89560b566073785535643e694c112bedbd3db13d src/outpost_sdk/metrics.py: id: 8db1d4257393 - last_write_checksum: sha1:731ca79bffd23397f1309366123752c36d03c9e1 - pristine_git_object: 4dfb7dd7476dc45bc95f79ed12d112a68635ac35 + last_write_checksum: sha1:6fbf2f06a166664412a4fbe93d5bbb889055982d + pristine_git_object: 83a901d70f6ba0e3236918bf1c658451050b9337 src/outpost_sdk/models/__init__.py: id: 690a20e1a54c last_write_checksum: sha1:bf41d3fc7d4d3caf1c92ebd77acdcbdc1ce4f6d4 pristine_git_object: 0838b4df458550dfb919fece960423ef6550e873 src/outpost_sdk/models/attempt.py: id: 931b46ffc0d9 - last_write_checksum: sha1:ad0b3369316e4986c8a8b853bf559f6845d7cb47 - pristine_git_object: 09a5fc10a4204309c21bd5468662a382b914c720 + last_write_checksum: sha1:c3477fbad71227ba32085ac158e5f53b5ebc298b + pristine_git_object: e2f2fe57ccfd732ef61bfc48b31b24fd6acd0637 src/outpost_sdk/models/attemptpaginatedresult.py: id: 8a2ab0a7d088 last_write_checksum: sha1:39409cd3e985c40ce038b6e29d28766a2694a04e @@ -1363,8 +1363,8 @@ trackedFiles: pristine_git_object: 562dfd33f447bc074b4746366d7a54ed0f7e1248 src/outpost_sdk/models/getattemptmetricsop.py: id: f4bca8e34941 - last_write_checksum: sha1:9339289cc9ec944bc10b6eb05b00c9a6c120b611 - pristine_git_object: f91b7d0b4546b4acee1a6f3513527863792aa061 + last_write_checksum: sha1:1cbcc7c87b40be710030739f9aa53796250cb53a + pristine_git_object: 90c7530e4adfbb355950c0482f96a99835fa38cc src/outpost_sdk/models/getattemptop.py: id: 7782fa767ceb last_write_checksum: sha1:4513c749a0c423fff95ae8a27848f426cb8b26d5 @@ -2071,14 +2071,14 @@ examples: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"} AttemptWithIncludeExample: parameters: path: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "response_data": {"status_code": 200, "body": "{\"status\":\"ok\"}", "headers": {"content-type": "application/json"}}, "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}, "data": {"user_id": "userid", "status": "active"}}} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "response_data": {"status_code": 200, "body": "{\"status\":\"ok\"}", "headers": {"content-type": "application/json"}}, "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}, "data": {"user_id": "userid", "status": "active"}}} retryEvent: RetryAccepted: requestBody: @@ -2110,7 +2110,7 @@ examples: dir: "desc" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "atm_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "event_id": "evt_789", "destination_id": "des_456"}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "atm_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "latency_ms": 1502, "event_id": "evt_789", "destination_id": "des_456"}]} getTenantDestinationAttempt: DestinationAttemptExample: parameters: @@ -2120,7 +2120,7 @@ examples: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"} listDestinationTypeSchemas: DestinationTypesExample: responses: @@ -2146,7 +2146,7 @@ examples: destination_type: "webhook" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "att_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "event_id": "evt_789", "destination_id": "des_789"}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "att_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "latency_ms": 1502, "event_id": "evt_789", "destination_id": "des_789"}]} AdminAttemptsWithIncludeExample: parameters: query: @@ -2156,7 +2156,7 @@ examples: destination_type: "webhook" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}, "models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}, "models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}]} getEventMetrics: speakeasy-default-get-event-metrics: parameters: @@ -2195,7 +2195,7 @@ examples: time[start]: "2026-03-02T00:00:00Z" time[end]: "2026-03-03T00:00:00Z" granularity: "1h" - measures: ["count", "error_rate"] + measures: ["count", "error_rate", "p95_latency"] filters[destination_type]: "webhook" time: {"start": "2026-03-02T00:00:00Z", "end": "2026-03-03T00:00:00Z"} responses: @@ -2215,12 +2215,12 @@ examples: time[start]: "2026-03-02T00:00:00Z" time[end]: "2026-03-03T00:00:00Z" granularity: "1h" - measures: ["count", "error_rate"] + measures: ["count", "error_rate", "p95_latency"] filters[destination_type]: "webhook" time: {"start": "2026-03-02T00:00:00Z", "end": "2026-03-03T00:00:00Z"} responses: "200": - application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}} + application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211, "avg_latency": 212.4, "p95_latency": 810}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}} getManagedConfig: speakeasy-default-get-managed-config: responses: @@ -2247,7 +2247,7 @@ examples: application/json: {} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: "## Python SDK Changes:\n* `outpost.configuration.get_managed_config()`: `response` **Changed**\n* `outpost.configuration.update_managed_config()`: \n * `request` **Changed**\n * `response` **Changed**\n" +releaseNotes: "## Python SDK Changes:\n* `outpost.metrics.get_attempt_metrics()`: \n * `request.measures` **Changed** (Breaking ⚠️)\n* `outpost.attempts.list()`: `response.models[].latency_ms` **Added**\n* `outpost.attempts.get()`: `response.latency_ms` **Added**\n* `outpost.destinations.list_attempts()`: `response.models[].latency_ms` **Added**\n* `outpost.destinations.get_attempt()`: `response.latency_ms` **Added**\n" generatedFiles: - .gitattributes - .vscode/settings.json diff --git a/sdks/outpost-python/.speakeasy/gen.yaml b/sdks/outpost-python/.speakeasy/gen.yaml index 9c372a438..68b5f82c2 100644 --- a/sdks/outpost-python/.speakeasy/gen.yaml +++ b/sdks/outpost-python/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 1.6.0 + version: 1.6.1 additionalDependencies: dev: {} main: {} diff --git a/sdks/outpost-python/RELEASES.md b/sdks/outpost-python/RELEASES.md index c350a0892..7b78ae0ad 100644 --- a/sdks/outpost-python/RELEASES.md +++ b/sdks/outpost-python/RELEASES.md @@ -198,4 +198,14 @@ Based on: ### Generated - [python v1.6.0] sdks/outpost-python ### Releases -- [PyPI v1.6.0] https://pypi.org/project/outpost_sdk/1.6.0 - sdks/outpost-python \ No newline at end of file +- [PyPI v1.6.0] https://pypi.org/project/outpost_sdk/1.6.0 - sdks/outpost-python + +## 2026-09-23 18:01:55 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.798.0 (2.938.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.6.1] sdks/outpost-python +### Releases +- [PyPI v1.6.1] https://pypi.org/project/outpost_sdk/1.6.1 - sdks/outpost-python \ No newline at end of file diff --git a/sdks/outpost-python/docs/models/attempt.md b/sdks/outpost-python/docs/models/attempt.md index 4b5deb47e..3472c4469 100644 --- a/sdks/outpost-python/docs/models/attempt.md +++ b/sdks/outpost-python/docs/models/attempt.md @@ -5,17 +5,18 @@ An attempt represents a single delivery attempt of an event to a destination. ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -| `id` | *Optional[str]* | :heavy_minus_sign: | Unique identifier for this attempt. | atm_123 | -| `tenant_id` | *Optional[str]* | :heavy_minus_sign: | The tenant this attempt belongs to. | tnt_123 | -| `status` | [Optional[models.Status]](../models/status.md) | :heavy_minus_sign: | The attempt status. | success | -| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Time the attempt was made. | 2024-01-01T00:00:05Z | -| `code` | *Optional[str]* | :heavy_minus_sign: | Response status code or error code. | 200 | -| `response_data` | Dict[str, *Any*] | :heavy_minus_sign: | Response data from the attempt. Only included when include=response_data. | {
"status_code": 200,
"body": "{\"status\":\"ok\"}",
"headers": {
"content-type": "application/json"
}
} | -| `attempt_number` | *Optional[int]* | :heavy_minus_sign: | The attempt number (1 for first attempt, 2+ for retries). | 1 | -| `manual` | *Optional[bool]* | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false | -| `event_id` | *Optional[str]* | :heavy_minus_sign: | The ID of the associated event. | evt_123 | -| `destination_id` | *Optional[str]* | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 | -| `event` | [OptionalNullable[models.EventUnion]](../models/eventunion.md) | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | | -| `destination` | [Optional[models.Destination]](../models/destination.md) | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *Optional[str]* | :heavy_minus_sign: | Unique identifier for this attempt. | atm_123 | +| `tenant_id` | *Optional[str]* | :heavy_minus_sign: | The tenant this attempt belongs to. | tnt_123 | +| `status` | [Optional[models.Status]](../models/status.md) | :heavy_minus_sign: | The attempt status. | success | +| `time` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | Time the attempt was made. | 2024-01-01T00:00:05Z | +| `code` | *Optional[str]* | :heavy_minus_sign: | Response status code or error code. | 200 | +| `response_data` | Dict[str, *Any*] | :heavy_minus_sign: | Response data from the attempt. Only included when include=response_data. | {
"status_code": 200,
"body": "{\"status\":\"ok\"}",
"headers": {
"content-type": "application/json"
}
} | +| `attempt_number` | *Optional[int]* | :heavy_minus_sign: | The attempt number (1 for first attempt, 2+ for retries). | 1 | +| `manual` | *Optional[bool]* | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false | +| `latency_ms` | *OptionalNullable[int]* | :heavy_minus_sign: | Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked. | 212 | +| `event_id` | *Optional[str]* | :heavy_minus_sign: | The ID of the associated event. | evt_123 | +| `destination_id` | *Optional[str]* | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 | +| `event` | [OptionalNullable[models.EventUnion]](../models/eventunion.md) | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | | +| `destination` | [Optional[models.Destination]](../models/destination.md) | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum1.md b/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum1.md index 80fadf552..f94a42e60 100644 --- a/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum1.md +++ b/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum1.md @@ -23,4 +23,8 @@ value = GetAttemptMetricsMeasuresEnum1.COUNT | `AVG_ATTEMPT_NUMBER` | avg_attempt_number | | `RATE` | rate | | `SUCCESSFUL_RATE` | successful_rate | -| `FAILED_RATE` | failed_rate | \ No newline at end of file +| `FAILED_RATE` | failed_rate | +| `AVG_LATENCY` | avg_latency | +| `P50_LATENCY` | p50_latency | +| `P95_LATENCY` | p95_latency | +| `P99_LATENCY` | p99_latency | \ No newline at end of file diff --git a/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum2.md b/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum2.md index 6b523f6e1..cdc965e8c 100644 --- a/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum2.md +++ b/sdks/outpost-python/docs/models/getattemptmetricsmeasuresenum2.md @@ -23,4 +23,8 @@ value = GetAttemptMetricsMeasuresEnum2.COUNT | `AVG_ATTEMPT_NUMBER` | avg_attempt_number | | `RATE` | rate | | `SUCCESSFUL_RATE` | successful_rate | -| `FAILED_RATE` | failed_rate | \ No newline at end of file +| `FAILED_RATE` | failed_rate | +| `AVG_LATENCY` | avg_latency | +| `P50_LATENCY` | p50_latency | +| `P95_LATENCY` | p95_latency | +| `P99_LATENCY` | p99_latency | \ No newline at end of file diff --git a/sdks/outpost-python/docs/models/getattemptmetricsmeasuresunion.md b/sdks/outpost-python/docs/models/getattemptmetricsmeasuresunion.md index 77494922e..4eaf657b0 100644 --- a/sdks/outpost-python/docs/models/getattemptmetricsmeasuresunion.md +++ b/sdks/outpost-python/docs/models/getattemptmetricsmeasuresunion.md @@ -1,6 +1,6 @@ # GetAttemptMetricsMeasuresUnion -Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). +Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). ## Supported Types diff --git a/sdks/outpost-python/docs/models/getattemptmetricsrequest.md b/sdks/outpost-python/docs/models/getattemptmetricsrequest.md index 0fd0ab809..c7a10ae89 100644 --- a/sdks/outpost-python/docs/models/getattemptmetricsrequest.md +++ b/sdks/outpost-python/docs/models/getattemptmetricsrequest.md @@ -3,17 +3,17 @@ ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `time` | [models.GetAttemptMetricsTime](../models/getattemptmetricstime.md) | :heavy_check_mark: | Time range for the metrics query. | | -| `granularity` | *Optional[str]* | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h | -| `measures` | [models.GetAttemptMetricsMeasuresUnion](../models/getattemptmetricsmeasuresunion.md) | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate"
] | -| `dimensions` | [Optional[models.GetAttemptMetricsDimensionsUnion]](../models/getattemptmetricsdimensionsunion.md) | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | | -| `filters_destination_id` | [Optional[models.GetAttemptMetricsFiltersDestinationID]](../models/getattemptmetricsfiltersdestinationid.md) | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | | -| `filters_destination_type` | [Optional[models.FiltersDestinationType]](../models/filtersdestinationtype.md) | :heavy_minus_sign: | Filter by destination type(s). Use bracket notation for multiple values (e.g., `filters[destination_type][0]=webhook&filters[destination_type][1]=aws_sqs`). | | -| `filters_topic` | [Optional[models.GetAttemptMetricsFiltersTopic]](../models/getattemptmetricsfilterstopic.md) | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | | -| `filters_status` | [Optional[models.FiltersStatus]](../models/filtersstatus.md) | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | | -| `filters_code` | [Optional[models.FiltersCode]](../models/filterscode.md) | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | | -| `filters_manual` | [Optional[models.FiltersManual]](../models/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | | -| `filters_attempt_number` | [Optional[models.FiltersAttemptNumber]](../models/filtersattemptnumber.md) | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | | -| `filters_tenant_id` | [Optional[models.GetAttemptMetricsFiltersTenantID]](../models/getattemptmetricsfilterstenantid.md) | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `time` | [models.GetAttemptMetricsTime](../models/getattemptmetricstime.md) | :heavy_check_mark: | Time range for the metrics query. | | +| `granularity` | *Optional[str]* | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h | +| `measures` | [models.GetAttemptMetricsMeasuresUnion](../models/getattemptmetricsmeasuresunion.md) | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate",
"p95_latency"
] | +| `dimensions` | [Optional[models.GetAttemptMetricsDimensionsUnion]](../models/getattemptmetricsdimensionsunion.md) | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | | +| `filters_destination_id` | [Optional[models.GetAttemptMetricsFiltersDestinationID]](../models/getattemptmetricsfiltersdestinationid.md) | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | | +| `filters_destination_type` | [Optional[models.FiltersDestinationType]](../models/filtersdestinationtype.md) | :heavy_minus_sign: | Filter by destination type(s). Use bracket notation for multiple values (e.g., `filters[destination_type][0]=webhook&filters[destination_type][1]=aws_sqs`). | | +| `filters_topic` | [Optional[models.GetAttemptMetricsFiltersTopic]](../models/getattemptmetricsfilterstopic.md) | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | | +| `filters_status` | [Optional[models.FiltersStatus]](../models/filtersstatus.md) | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | | +| `filters_code` | [Optional[models.FiltersCode]](../models/filterscode.md) | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | | +| `filters_manual` | [Optional[models.FiltersManual]](../models/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | | +| `filters_attempt_number` | [Optional[models.FiltersAttemptNumber]](../models/filtersattemptnumber.md) | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | | +| `filters_tenant_id` | [Optional[models.GetAttemptMetricsFiltersTenantID]](../models/getattemptmetricsfilterstenantid.md) | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | | \ No newline at end of file diff --git a/sdks/outpost-python/docs/sdks/metrics/README.md b/sdks/outpost-python/docs/sdks/metrics/README.md index b1c1f206d..cc5c51c9e 100644 --- a/sdks/outpost-python/docs/sdks/metrics/README.md +++ b/sdks/outpost-python/docs/sdks/metrics/README.md @@ -78,7 +78,11 @@ dimensional grouping, and filtering. **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, -`rate`, `successful_rate`, `failed_rate` +`rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + +Latency measures are in milliseconds and computed over attempts that recorded a +latency (see `latency_ms` on the attempt object). They are `null` for a bucket +with no such attempts, rather than `0`. **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` @@ -106,6 +110,7 @@ with Outpost( "measures": [ models.GetAttemptMetricsMeasuresEnum2.COUNT, models.GetAttemptMetricsMeasuresEnum2.ERROR_RATE, + models.GetAttemptMetricsMeasuresEnum2.P95_LATENCY, ], "filters_destination_type": models.DestinationType.WEBHOOK, }) diff --git a/sdks/outpost-python/pyproject.toml b/sdks/outpost-python/pyproject.toml index 456771de1..59a423fe1 100644 --- a/sdks/outpost-python/pyproject.toml +++ b/sdks/outpost-python/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "outpost_sdk" -version = "1.6.0" +version = "1.6.1" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Speakeasy" },] readme = "README-PYPI.md" diff --git a/sdks/outpost-python/src/outpost_sdk/_version.py b/sdks/outpost-python/src/outpost_sdk/_version.py index 9e2b43403..9f058c8bb 100644 --- a/sdks/outpost-python/src/outpost_sdk/_version.py +++ b/sdks/outpost-python/src/outpost_sdk/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "outpost_sdk" -__version__: str = "1.6.0" +__version__: str = "1.6.1" __openapi_doc_version__: str = "0.0.1" __gen_version__: str = "2.938.0" -__user_agent__: str = "speakeasy-sdk/python 1.6.0 2.938.0 0.0.1 outpost_sdk" +__user_agent__: str = "speakeasy-sdk/python 1.6.1 2.938.0 0.0.1 outpost_sdk" try: if __package__ is not None: diff --git a/sdks/outpost-python/src/outpost_sdk/metrics.py b/sdks/outpost-python/src/outpost_sdk/metrics.py index 4dfb7dd74..83a901d70 100644 --- a/sdks/outpost-python/src/outpost_sdk/metrics.py +++ b/sdks/outpost-python/src/outpost_sdk/metrics.py @@ -259,7 +259,11 @@ def get_attempt_metrics( **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, - `rate`, `successful_rate`, `failed_rate` + `rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + + Latency measures are in milliseconds and computed over attempts that recorded a + latency (see `latency_ms` on the attempt object). They are `null` for a bucket + with no such attempts, rather than `0`. **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` @@ -376,7 +380,11 @@ async def get_attempt_metrics_async( **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, - `rate`, `successful_rate`, `failed_rate` + `rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + + Latency measures are in milliseconds and computed over attempts that recorded a + latency (see `latency_ms` on the attempt object). They are `null` for a bucket + with no such attempts, rather than `0`. **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` diff --git a/sdks/outpost-python/src/outpost_sdk/models/attempt.py b/sdks/outpost-python/src/outpost_sdk/models/attempt.py index 09a5fc10a..e2f2fe57c 100644 --- a/sdks/outpost-python/src/outpost_sdk/models/attempt.py +++ b/sdks/outpost-python/src/outpost_sdk/models/attempt.py @@ -204,6 +204,8 @@ class AttemptTypedDict(TypedDict): r"""The attempt number (1 for first attempt, 2+ for retries).""" manual: NotRequired[bool] r"""Whether this attempt was manually triggered (e.g., a retry initiated by a user).""" + latency_ms: NotRequired[Nullable[int]] + r"""Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked.""" event_id: NotRequired[str] r"""The ID of the associated event.""" destination_id: NotRequired[str] @@ -240,6 +242,9 @@ class Attempt(BaseModel): manual: Optional[bool] = None r"""Whether this attempt was manually triggered (e.g., a retry initiated by a user).""" + latency_ms: OptionalNullable[int] = UNSET + r"""Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked.""" + event_id: Optional[str] = None r"""The ID of the associated event.""" @@ -263,13 +268,14 @@ def serialize_model(self, handler): "response_data", "attempt_number", "manual", + "latency_ms", "event_id", "destination_id", "event", "destination", ] ) - nullable_fields = set(["response_data", "event"]) + nullable_fields = set(["response_data", "latency_ms", "event"]) serialized = handler(self) m = {} diff --git a/sdks/outpost-python/src/outpost_sdk/models/getattemptmetricsop.py b/sdks/outpost-python/src/outpost_sdk/models/getattemptmetricsop.py index f91b7d0b4..90c7530e4 100644 --- a/sdks/outpost-python/src/outpost_sdk/models/getattemptmetricsop.py +++ b/sdks/outpost-python/src/outpost_sdk/models/getattemptmetricsop.py @@ -43,6 +43,10 @@ class GetAttemptMetricsMeasuresEnum2(str, Enum): RATE = "rate" SUCCESSFUL_RATE = "successful_rate" FAILED_RATE = "failed_rate" + AVG_LATENCY = "avg_latency" + P50_LATENCY = "p50_latency" + P95_LATENCY = "p95_latency" + P99_LATENCY = "p99_latency" class GetAttemptMetricsMeasuresEnum1(str, Enum): @@ -57,20 +61,24 @@ class GetAttemptMetricsMeasuresEnum1(str, Enum): RATE = "rate" SUCCESSFUL_RATE = "successful_rate" FAILED_RATE = "failed_rate" + AVG_LATENCY = "avg_latency" + P50_LATENCY = "p50_latency" + P95_LATENCY = "p95_latency" + P99_LATENCY = "p99_latency" GetAttemptMetricsMeasuresUnionTypedDict = TypeAliasType( "GetAttemptMetricsMeasuresUnionTypedDict", Union[GetAttemptMetricsMeasuresEnum1, List[GetAttemptMetricsMeasuresEnum2]], ) -r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" +r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" GetAttemptMetricsMeasuresUnion = TypeAliasType( "GetAttemptMetricsMeasuresUnion", Union[GetAttemptMetricsMeasuresEnum1, List[GetAttemptMetricsMeasuresEnum2]], ) -r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" +r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" class GetAttemptMetricsDimensionsEnum2(str, Enum): @@ -208,7 +216,7 @@ class GetAttemptMetricsRequestTypedDict(TypedDict): time: GetAttemptMetricsTimeTypedDict r"""Time range for the metrics query.""" measures: GetAttemptMetricsMeasuresUnionTypedDict - r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" + r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" granularity: NotRequired[str] r"""Time bucketing granularity. Pattern: ``. Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12). @@ -246,7 +254,7 @@ class GetAttemptMetricsRequest(BaseModel): GetAttemptMetricsMeasuresUnion, FieldMetadata(query=QueryParamMetadata(style="form", explode=True)), ] - r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" + r"""Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).""" granularity: Annotated[ Optional[str], diff --git a/sdks/outpost-typescript/.speakeasy/gen.lock b/sdks/outpost-typescript/.speakeasy/gen.lock index 9797cddba..69afd56e3 100644 --- a/sdks/outpost-typescript/.speakeasy/gen.lock +++ b/sdks/outpost-typescript/.speakeasy/gen.lock @@ -1,20 +1,20 @@ lockVersion: 2.0.0 id: edb58086-83b9-45a3-9095-52bf57a11009 management: - docChecksum: 5a8af4b2c39a07acdceeb2849a73b495 + docChecksum: 0f67a4d573857f18ed5910485374e83f docVersion: 0.0.1 speakeasyVersion: 1.798.0 generationVersion: 2.938.0 - releaseVersion: 1.6.0 - configChecksum: d8d2a2ec2e1308f0cee63fe9310baf43 + releaseVersion: 1.6.1 + configChecksum: 8a142e6f93475dce07c9c07ea1d169ed repoURL: https://github.com/hookdeck/outpost.git repoSubDirectory: sdks/outpost-typescript installationURL: https://github.com/hookdeck/outpost published: true persistentEdits: - generation_id: c00a7821-85a9-4342-b330-94d3dc99745c - pristine_commit_hash: 7b7dd214d4ee0576c5f999d6fea9eb9c23b9ee82 - pristine_tree_hash: d3c2303f690789eaf602afb8f1b797d32925fd44 + generation_id: 404192cf-a09c-4f37-8ff7-f52b95b531da + pristine_commit_hash: 5df3e75dd5e13c7dad37eed7713bebf3c345d7ea + pristine_tree_hash: 38df24188bbb515e6933e52850278b5d73400891 features: typescript: additionalDependencies: 0.1.0 @@ -64,12 +64,12 @@ trackedFiles: pristine_git_object: 08f95f4552349360b2c0b01802aa71ec3a55d2c2 docs/models/components/attempt.md: id: 830868ab1006 - last_write_checksum: sha1:89bf4bcab979aeec8131c125b6fd12eb1c2ede69 - pristine_git_object: 02a589e3ed6d897b64f4bc4ed4f4caa5d1a15044 + last_write_checksum: sha1:e60b5b6a0154c7bdf1cb660124984f6b7e9cb906 + pristine_git_object: 22424df152d1f91ce0d87312d5a2e060ae8412d9 docs/models/components/attemptpaginatedresult.md: id: 56e122fd3059 - last_write_checksum: sha1:036e31e2f221ce2e35554b1e454a304f7f7eaa6b - pristine_git_object: b1933d393c3e0a39b871fedfc73abc6672391767 + last_write_checksum: sha1:8c969062b9321395819cca86dfde86740724f704 + pristine_git_object: b28f8c716bcdaf3f1c750d21d2b2dfdf4a803709 docs/models/components/awskinesisconfig.md: id: e1381238f2b5 last_write_checksum: sha1:fb59168acb39a57db5e2e7e2036b76a7479c42ef @@ -592,20 +592,20 @@ trackedFiles: pristine_git_object: 407ff50afa8f8c4ced76bd279ce099ddf835cc13 docs/models/operations/getattemptmetricsmeasuresenum1.md: id: 4057a7c16751 - last_write_checksum: sha1:8bc0fd958dd710419789aa9d3cba45a240a59f26 - pristine_git_object: 7f97c190fe8c9d2040ac60a8e361314f5e65517d + last_write_checksum: sha1:ecef313b42ae186609565e96be636317b0bd3dd7 + pristine_git_object: 5d52fd179c464ed5cd5dd8acbafd66d16d93093d docs/models/operations/getattemptmetricsmeasuresenum2.md: id: dfe6f415e02b - last_write_checksum: sha1:9ede77d8a6b0a3e3dcdbb7474dd8a98d38ba4cc5 - pristine_git_object: 2da8d17f8ddb8cba068b2f5e7aeccc95b7233f14 + last_write_checksum: sha1:eae7a47700cb32937199c33f938d72c1b89a23b4 + pristine_git_object: 11485be3307e6b259fe17087d3356b9e34440891 docs/models/operations/getattemptmetricsmeasuresunion.md: id: 454f41df243f - last_write_checksum: sha1:83327880d33e9832dbb5449952ba3d3e5d9d89fe - pristine_git_object: 13c46492d75f9f7567e76a07c941a9ebd007564f + last_write_checksum: sha1:a9b81b33095d9d5d9b6b181cec93f1f5a47d7058 + pristine_git_object: 36f44d6d0d28f0289e5c2fb2dad51fb89c4f1a41 docs/models/operations/getattemptmetricsrequest.md: id: accc5c32f0c1 - last_write_checksum: sha1:ab3c6a1b8f74c7ee320f0329aa434e575c287441 - pristine_git_object: ff91ccf38daffd3e30b2545f36dfd4db88f726a1 + last_write_checksum: sha1:35bd63b458b6aa30ab6394f21d5a274f14c05dea + pristine_git_object: 3ad30be04fbb8ac6a9a7ea1b71c45219f00b042a docs/models/operations/getattemptmetricstime.md: id: c8761ce0a990 last_write_checksum: sha1:1a9daf18c72540a0b7126ae390eeea1a2faa64c2 @@ -864,8 +864,8 @@ trackedFiles: pristine_git_object: 449ddd48a78e7ea3f7b8011f1cd4ce8aa4800293 docs/sdks/metrics/README.md: id: a8545d964e21 - last_write_checksum: sha1:6da3e9f8e453d300ac701373b424e6dd976f2d8b - pristine_git_object: 7534492532f1b1ee9a007a29117e667d32c16089 + last_write_checksum: sha1:c2a43eb571c96a6e4b1e06e3662b4517c3351634 + pristine_git_object: 9490574b88027229e3695c1d8e2477106ab3f8d6 docs/sdks/outpost/README.md: id: f9b868668835 last_write_checksum: sha1:221bdd0552dc258796e0dc93c7284984bdaf13b0 @@ -904,12 +904,12 @@ trackedFiles: pristine_git_object: c9a9042272cbc4b2cf7ae93f82d4ea8a7d25bba2 jsr.json: id: 7f6ab7767282 - last_write_checksum: sha1:e88c4d6691692a3901856869d0683257d00137ea - pristine_git_object: ea50fefe6ae3225f9d404230426865ddcbc6ed9f + last_write_checksum: sha1:a31ba6d5ddc4e58db20624ee6353d9a54a543415 + pristine_git_object: 6e1f2cc211a8d066ffaabfdedca1772b3e29e796 package.json: id: 7030d0b2f71b - last_write_checksum: sha1:0038296290c920151978948146128aa9d3351f0d - pristine_git_object: da6b7aa37c189baf95285b82f8a23fc794add8ff + last_write_checksum: sha1:ce7d5bb6b9e757ecfa5c79a8ad0e10c34a5119ac + pristine_git_object: e474029f8d0efe7eacfa53c37dd8d5118d9e7970 src/core.ts: id: f431fdbcd144 last_write_checksum: sha1:c858d8ea76a86c428e26943bf348319ba0a3c865 @@ -980,8 +980,8 @@ trackedFiles: pristine_git_object: 579d3b24fffd1228f969be7c717c236caf4acb7b src/funcs/metricsGetAttemptMetrics.ts: id: a88a3e2b33dd - last_write_checksum: sha1:b1d46bfc7dc043cf8242ccb28da36c3028140dd9 - pristine_git_object: 60559220d1b71e0033db52fcbd831830dc415163 + last_write_checksum: sha1:48943b6e3e24ee3b7bc54168d2a63f830901a9a5 + pristine_git_object: 49d0a38167c22da6899242e66c5017517333582f src/funcs/metricsGetEventMetrics.ts: id: c35ea4d8a7df last_write_checksum: sha1:f45a1519e06a25e8d5f25bd6ecafbc0afeb8eb66 @@ -1052,8 +1052,8 @@ trackedFiles: pristine_git_object: 0aebd8b0a4867e35cb3348fc52921c3c0b4725b7 src/lib/config.ts: id: 320761608fb3 - last_write_checksum: sha1:40455ec94a616300afc53d4f936d49e61dcbe49f - pristine_git_object: 9381fc3a7b215c8de073209eb33fdad75c78e763 + last_write_checksum: sha1:74200b05021db6bcacf859f030d759e127a667a8 + pristine_git_object: 55ac18b10b5412d9f3518274e3eacfd64aebc5a1 src/lib/encodings.ts: id: 3bd8ead98afd last_write_checksum: sha1:a257d6f6108693db2197617c579400bc8f0da914 @@ -1124,8 +1124,8 @@ trackedFiles: pristine_git_object: 0955a573c2ce989d63c737410ab8cc28706d9f74 src/mcp-server/mcp-server.ts: id: aabbc4ab07c1 - last_write_checksum: sha1:1589242d00cc1ecbb7641f784d20b01d4becdc21 - pristine_git_object: 6849acff15861500a6337600b59afd7a03efc58e + last_write_checksum: sha1:3668520bee2614a631354c459260f95ad864c16c + pristine_git_object: 9bb415546ae409812673ada09666284d88aa341a src/mcp-server/prompts.ts: id: 26f3d73cbf31 last_write_checksum: sha1:3472c8babea2d3b44d3a61e42fbba471fbd936b7 @@ -1140,8 +1140,8 @@ trackedFiles: pristine_git_object: c25696d4c4f70e081fa5d87ad6891874c509a577 src/mcp-server/server.ts: id: 2784dd48e82a - last_write_checksum: sha1:c0e03ed46df2af900282da1587dd6ded1d52b120 - pristine_git_object: 1e8af0b3922136af035446e8b8ed7ffa4dcde03a + last_write_checksum: sha1:44e6ca9dd8742589fafd1655697b96cad711b662 + pristine_git_object: abb4805847783a68ce0c5f75b0e032c37f874872 src/mcp-server/shared.ts: id: 074e80d4be1e last_write_checksum: sha1:d89576cea2bef3856b7fc3e65b868875528be042 @@ -1216,8 +1216,8 @@ trackedFiles: pristine_git_object: 6f72cb397fee5d70548129bc2335a877dadc911d src/mcp-server/tools/metricsGetAttemptMetrics.ts: id: fcf855dd8ff5 - last_write_checksum: sha1:41a698f268eadabdbb14a30291a3543f503eb26e - pristine_git_object: 44913cd5337471bcb8d6c1dca21d09f6246bc748 + last_write_checksum: sha1:e935b8c7dd247215ca9c3779c14ab1741f4fcbee + pristine_git_object: 9c830d09af42378cbf5529966e1a483dc70266fd src/mcp-server/tools/metricsGetEventMetrics.ts: id: 6e20dd2dcf8e last_write_checksum: sha1:25d67affdeb0c7e3ddc0618468ec462b24f6e0c1 @@ -1268,8 +1268,8 @@ trackedFiles: pristine_git_object: fabf96e933821da6e0b5f1deac287d966657a7b7 src/models/components/attempt.ts: id: 55593c6ff589 - last_write_checksum: sha1:6cee7dd36cceae6b6d0e87c11f4779492ee8b256 - pristine_git_object: f87ca560962c5c7a09ff2b5ac75b23168753894a + last_write_checksum: sha1:522f408a32573bcd9ca5dd0b6a841856d0096d4e + pristine_git_object: 8096c7dcaac5aecbdb94db9263d4ae58a8d901c3 src/models/components/attemptpaginatedresult.ts: id: cee08168c920 last_write_checksum: sha1:52b62178b98d136ee8c7af7d7e07e47add69bbbb @@ -1704,8 +1704,8 @@ trackedFiles: pristine_git_object: 1e10698023fab3c67f3c418f810b52af5a353ff4 src/models/operations/getattemptmetrics.ts: id: 046acdbc5af3 - last_write_checksum: sha1:41458e37a3660e9c0a35c6ca5096b5d1129831d8 - pristine_git_object: aef39ef184312ab3ff622c4d8925cede19f7ce2d + last_write_checksum: sha1:710d0752a4ef266e5a024cb4e6e8ffcf1e22bbd1 + pristine_git_object: a08ecd7a22289a0e5fb9e4af7690087969bd96e2 src/models/operations/getdestinationtypeschema.ts: id: 66f17cba3cea last_write_checksum: sha1:6a4c924cdc3741bedfafe8a68a2f8331fbcd12be @@ -1800,8 +1800,8 @@ trackedFiles: pristine_git_object: ecac2264817bb369ff2dbf0f0e9029807e67ff77 src/sdk/metrics.ts: id: f82082e1b05c - last_write_checksum: sha1:8b2d03950ab50c7f4a65ab7f5e448b39c68e91c2 - pristine_git_object: 90c477cb381a7de04b1cf1e37b750bdfe89d25f1 + last_write_checksum: sha1:613ad824e0ae1a96ad219fccec354e869cf845db + pristine_git_object: 2dc907eca1b7bd6ea814276e4dee2f650c6aaafb src/sdk/schemas.ts: id: bf5cb229a409 last_write_checksum: sha1:c6dca980b5b55f2bd16bc4ea393fa1e79a3bbbdc @@ -2268,14 +2268,14 @@ examples: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"} AttemptWithIncludeExample: parameters: path: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "response_data": {"status_code": 200, "body": "{\"status\":\"ok\"}", "headers": {"content-type": "application/json"}}, "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}, "data": {"user_id": "userid", "status": "active"}}} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "response_data": {"status_code": 200, "body": "{\"status\":\"ok\"}", "headers": {"content-type": "application/json"}}, "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}, "data": {"user_id": "userid", "status": "active"}}} retryEvent: RetryAccepted: requestBody: @@ -2307,7 +2307,7 @@ examples: dir: "desc" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "atm_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "event_id": "evt_789", "destination_id": "des_456"}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "atm_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "latency_ms": 1502, "event_id": "evt_789", "destination_id": "des_456"}]} getTenantDestinationAttempt: DestinationAttemptExample: parameters: @@ -2317,7 +2317,7 @@ examples: attempt_id: "" responses: "200": - application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"} + application/json: {"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"} listDestinationTypeSchemas: DestinationTypesExample: responses: @@ -2343,7 +2343,7 @@ examples: destination_type: "webhook" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "att_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "event_id": "evt_789", "destination_id": "des_789"}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": "MTcwNDA2NzIwMA==", "prev": null}, "models": [{"id": "atm_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456"}, {"id": "att_124", "status": "failed", "time": "2024-01-02T10:00:01Z", "code": "503", "attempt_number": 2, "latency_ms": 1502, "event_id": "evt_789", "destination_id": "des_789"}]} AdminAttemptsWithIncludeExample: parameters: query: @@ -2353,7 +2353,7 @@ examples: destination_type: "webhook" responses: "200": - application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}, "models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}]} + application/json: {"pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}, "models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "latency_ms": 212, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}]} getEventMetrics: speakeasy-default-get-event-metrics: parameters: @@ -2392,7 +2392,7 @@ examples: time[start]: "2026-03-02T00:00:00Z" time[end]: "2026-03-03T00:00:00Z" granularity: "1h" - measures: ["count", "error_rate"] + measures: ["count", "error_rate", "p95_latency"] filters[destination_type]: "webhook" time: {"start": "2026-03-02T00:00:00Z", "end": "2026-03-03T00:00:00Z"} responses: @@ -2412,12 +2412,12 @@ examples: time[start]: "2026-03-02T00:00:00Z" time[end]: "2026-03-03T00:00:00Z" granularity: "1h" - measures: ["count", "error_rate"] + measures: ["count", "error_rate", "p95_latency"] filters[destination_type]: "webhook" time: {"start": "2026-03-02T00:00:00Z", "end": "2026-03-03T00:00:00Z"} responses: "200": - application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}} + application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211, "avg_latency": 212.4, "p95_latency": 810}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}} getManagedConfig: speakeasy-default-get-managed-config: responses: @@ -2444,7 +2444,7 @@ examples: application/json: {} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: "## Typescript SDK Changes:\n* `outpost.configuration.getManagedConfig()`: `response` **Changed**\n* `outpost.configuration.updateManagedConfig()`: \n * `request` **Changed**\n * `response` **Changed**\n" +releaseNotes: "## Typescript SDK Changes:\n* `outpost.metrics.getAttemptMetrics()`: \n * `request.measures` **Changed** (Breaking ⚠️)\n* `outpost.attempts.list()`: `response.models[].latencyMs` **Added**\n* `outpost.attempts.get()`: `response.latencyMs` **Added**\n* `outpost.destinations.listAttempts()`: `response.models[].latencyMs` **Added**\n* `outpost.destinations.getAttempt()`: `response.latencyMs` **Added**\n" generatedFiles: - .gitattributes - .npmignore diff --git a/sdks/outpost-typescript/.speakeasy/gen.yaml b/sdks/outpost-typescript/.speakeasy/gen.yaml index f3e43dba2..a07096790 100644 --- a/sdks/outpost-typescript/.speakeasy/gen.yaml +++ b/sdks/outpost-typescript/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false typescript: - version: 1.6.0 + version: 1.6.1 acceptHeaderEnum: true additionalDependencies: dependencies: {} diff --git a/sdks/outpost-typescript/RELEASES.md b/sdks/outpost-typescript/RELEASES.md index 0f00e4b4d..00c370bbf 100644 --- a/sdks/outpost-typescript/RELEASES.md +++ b/sdks/outpost-typescript/RELEASES.md @@ -208,4 +208,14 @@ Based on: ### Generated - [typescript v1.6.0] sdks/outpost-typescript ### Releases -- [NPM v1.6.0] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/1.6.0 - sdks/outpost-typescript \ No newline at end of file +- [NPM v1.6.0] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/1.6.0 - sdks/outpost-typescript + +## 2026-09-23 18:05:36 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.798.0 (2.938.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [typescript v1.6.1] sdks/outpost-typescript +### Releases +- [NPM v1.6.1] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/1.6.1 - sdks/outpost-typescript \ No newline at end of file diff --git a/sdks/outpost-typescript/docs/models/components/attempt.md b/sdks/outpost-typescript/docs/models/components/attempt.md index 02a589e3e..22424df15 100644 --- a/sdks/outpost-typescript/docs/models/components/attempt.md +++ b/sdks/outpost-typescript/docs/models/components/attempt.md @@ -22,6 +22,7 @@ let value: Attempt = { }, attemptNumber: 1, manual: false, + latencyMs: 212, eventId: "evt_123", destinationId: "des_456", event: { @@ -59,17 +60,18 @@ let value: Attempt = { ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -| `id` | *string* | :heavy_minus_sign: | Unique identifier for this attempt. | atm_123 | -| `tenantId` | *string* | :heavy_minus_sign: | The tenant this attempt belongs to. | tnt_123 | -| `status` | [components.Status](../../models/components/status.md) | :heavy_minus_sign: | The attempt status. | success | -| `time` | [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) | :heavy_minus_sign: | Time the attempt was made. | 2024-01-01T00:00:05Z | -| `code` | *string* | :heavy_minus_sign: | Response status code or error code. | 200 | -| `responseData` | Record | :heavy_minus_sign: | Response data from the attempt. Only included when include=response_data. | {
"status_code": 200,
"body": "{\"status\":\"ok\"}",
"headers": {
"content-type": "application/json"
}
} | -| `attemptNumber` | *number* | :heavy_minus_sign: | The attempt number (1 for first attempt, 2+ for retries). | 1 | -| `manual` | *boolean* | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false | -| `eventId` | *string* | :heavy_minus_sign: | The ID of the associated event. | evt_123 | -| `destinationId` | *string* | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 | -| `event` | *components.EventUnion* | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | | -| `destination` | *components.Destination* | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *string* | :heavy_minus_sign: | Unique identifier for this attempt. | atm_123 | +| `tenantId` | *string* | :heavy_minus_sign: | The tenant this attempt belongs to. | tnt_123 | +| `status` | [components.Status](../../models/components/status.md) | :heavy_minus_sign: | The attempt status. | success | +| `time` | [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) | :heavy_minus_sign: | Time the attempt was made. | 2024-01-01T00:00:05Z | +| `code` | *string* | :heavy_minus_sign: | Response status code or error code. | 200 | +| `responseData` | Record | :heavy_minus_sign: | Response data from the attempt. Only included when include=response_data. | {
"status_code": 200,
"body": "{\"status\":\"ok\"}",
"headers": {
"content-type": "application/json"
}
} | +| `attemptNumber` | *number* | :heavy_minus_sign: | The attempt number (1 for first attempt, 2+ for retries). | 1 | +| `manual` | *boolean* | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false | +| `latencyMs` | *number* | :heavy_minus_sign: | Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked. | 212 | +| `eventId` | *string* | :heavy_minus_sign: | The ID of the associated event. | evt_123 | +| `destinationId` | *string* | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 | +| `event` | *components.EventUnion* | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | | +| `destination` | *components.Destination* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/sdks/outpost-typescript/docs/models/components/attemptpaginatedresult.md b/sdks/outpost-typescript/docs/models/components/attemptpaginatedresult.md index b1933d393..b28f8c716 100644 --- a/sdks/outpost-typescript/docs/models/components/attemptpaginatedresult.md +++ b/sdks/outpost-typescript/docs/models/components/attemptpaginatedresult.md @@ -31,6 +31,7 @@ let value: AttemptPaginatedResult = { }, attemptNumber: 1, manual: false, + latencyMs: 212, eventId: "evt_123", destinationId: "des_456", event: { diff --git a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum1.md b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum1.md index 7f97c190f..5d52fd179 100644 --- a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum1.md +++ b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum1.md @@ -5,11 +5,11 @@ ```typescript import { GetAttemptMetricsMeasuresEnum1 } from "@hookdeck/outpost-sdk/models/operations"; -let value: GetAttemptMetricsMeasuresEnum1 = "manual_retry_count"; +let value: GetAttemptMetricsMeasuresEnum1 = "rate"; ``` ## Values ```typescript -"count" | "successful_count" | "failed_count" | "error_rate" | "first_attempt_count" | "retry_count" | "manual_retry_count" | "avg_attempt_number" | "rate" | "successful_rate" | "failed_rate" +"count" | "successful_count" | "failed_count" | "error_rate" | "first_attempt_count" | "retry_count" | "manual_retry_count" | "avg_attempt_number" | "rate" | "successful_rate" | "failed_rate" | "avg_latency" | "p50_latency" | "p95_latency" | "p99_latency" ``` \ No newline at end of file diff --git a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum2.md b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum2.md index 2da8d17f8..11485be33 100644 --- a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum2.md +++ b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresenum2.md @@ -5,11 +5,11 @@ ```typescript import { GetAttemptMetricsMeasuresEnum2 } from "@hookdeck/outpost-sdk/models/operations"; -let value: GetAttemptMetricsMeasuresEnum2 = "rate"; +let value: GetAttemptMetricsMeasuresEnum2 = "avg_latency"; ``` ## Values ```typescript -"count" | "successful_count" | "failed_count" | "error_rate" | "first_attempt_count" | "retry_count" | "manual_retry_count" | "avg_attempt_number" | "rate" | "successful_rate" | "failed_rate" +"count" | "successful_count" | "failed_count" | "error_rate" | "first_attempt_count" | "retry_count" | "manual_retry_count" | "avg_attempt_number" | "rate" | "successful_rate" | "failed_rate" | "avg_latency" | "p50_latency" | "p95_latency" | "p99_latency" ``` \ No newline at end of file diff --git a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresunion.md b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresunion.md index 13c46492d..36f44d6d0 100644 --- a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresunion.md +++ b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsmeasuresunion.md @@ -1,6 +1,6 @@ # GetAttemptMetricsMeasuresUnion -Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). +Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). ## Supported Types @@ -8,7 +8,7 @@ Measures to compute. At least one required. Rate measures (`rate`, `successful_r ### `operations.GetAttemptMetricsMeasuresEnum1` ```typescript -const value: operations.GetAttemptMetricsMeasuresEnum1 = "failed_rate"; +const value: operations.GetAttemptMetricsMeasuresEnum1 = "p99_latency"; ``` ### `operations.GetAttemptMetricsMeasuresEnum2[]` diff --git a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsrequest.md b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsrequest.md index ff91ccf38..3ad30be04 100644 --- a/sdks/outpost-typescript/docs/models/operations/getattemptmetricsrequest.md +++ b/sdks/outpost-typescript/docs/models/operations/getattemptmetricsrequest.md @@ -14,6 +14,7 @@ let value: GetAttemptMetricsRequest = { measures: [ "count", "error_rate", + "p95_latency", ], filtersDestinationType: "webhook", }; @@ -21,17 +22,17 @@ let value: GetAttemptMetricsRequest = { ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `time` | [operations.GetAttemptMetricsTime](../../models/operations/getattemptmetricstime.md) | :heavy_check_mark: | Time range for the metrics query. | | -| `granularity` | *string* | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h | -| `measures` | *operations.GetAttemptMetricsMeasuresUnion* | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate"
] | -| `dimensions` | *operations.GetAttemptMetricsDimensionsUnion* | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | | -| `filtersDestinationId` | *operations.GetAttemptMetricsFiltersDestinationId* | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | | -| `filtersDestinationType` | *operations.FiltersDestinationType* | :heavy_minus_sign: | Filter by destination type(s). Use bracket notation for multiple values (e.g., `filters[destination_type][0]=webhook&filters[destination_type][1]=aws_sqs`). | | -| `filtersTopic` | *operations.GetAttemptMetricsFiltersTopic* | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | | -| `filtersStatus` | *operations.FiltersStatus* | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | | -| `filtersCode` | *operations.FiltersCode* | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | | -| `filtersManual` | [operations.FiltersManual](../../models/operations/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | | -| `filtersAttemptNumber` | *operations.FiltersAttemptNumber* | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | | -| `filtersTenantId` | *operations.GetAttemptMetricsFiltersTenantId* | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `time` | [operations.GetAttemptMetricsTime](../../models/operations/getattemptmetricstime.md) | :heavy_check_mark: | Time range for the metrics query. | | +| `granularity` | *string* | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h | +| `measures` | *operations.GetAttemptMetricsMeasuresUnion* | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate",
"p95_latency"
] | +| `dimensions` | *operations.GetAttemptMetricsDimensionsUnion* | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | | +| `filtersDestinationId` | *operations.GetAttemptMetricsFiltersDestinationId* | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | | +| `filtersDestinationType` | *operations.FiltersDestinationType* | :heavy_minus_sign: | Filter by destination type(s). Use bracket notation for multiple values (e.g., `filters[destination_type][0]=webhook&filters[destination_type][1]=aws_sqs`). | | +| `filtersTopic` | *operations.GetAttemptMetricsFiltersTopic* | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | | +| `filtersStatus` | *operations.FiltersStatus* | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | | +| `filtersCode` | *operations.FiltersCode* | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | | +| `filtersManual` | [operations.FiltersManual](../../models/operations/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | | +| `filtersAttemptNumber` | *operations.FiltersAttemptNumber* | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | | +| `filtersTenantId` | *operations.GetAttemptMetricsFiltersTenantId* | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | | \ No newline at end of file diff --git a/sdks/outpost-typescript/docs/sdks/metrics/README.md b/sdks/outpost-typescript/docs/sdks/metrics/README.md index 753449253..9490574b8 100644 --- a/sdks/outpost-typescript/docs/sdks/metrics/README.md +++ b/sdks/outpost-typescript/docs/sdks/metrics/README.md @@ -116,7 +116,11 @@ dimensional grouping, and filtering. **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, -`rate`, `successful_rate`, `failed_rate` +`rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + +Latency measures are in milliseconds and computed over attempts that recorded a +latency (see `latency_ms` on the attempt object). They are `null` for a bucket +with no such attempts, rather than `0`. **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` @@ -143,6 +147,7 @@ async function run() { measures: [ "count", "error_rate", + "p95_latency", ], filtersDestinationType: "webhook", }); @@ -177,6 +182,7 @@ async function run() { measures: [ "count", "error_rate", + "p95_latency", ], filtersDestinationType: "webhook", }); diff --git a/sdks/outpost-typescript/examples/package-lock.json b/sdks/outpost-typescript/examples/package-lock.json index 3b671fcc4..60a4fbde3 100644 --- a/sdks/outpost-typescript/examples/package-lock.json +++ b/sdks/outpost-typescript/examples/package-lock.json @@ -18,7 +18,7 @@ }, "..": { "name": "@hookdeck/outpost-sdk", - "version": "1.6.0", + "version": "1.6.1", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "zod": "^3.25.0 || ^4.0.0" diff --git a/sdks/outpost-typescript/jsr.json b/sdks/outpost-typescript/jsr.json index ea50fefe6..6e1f2cc21 100644 --- a/sdks/outpost-typescript/jsr.json +++ b/sdks/outpost-typescript/jsr.json @@ -2,7 +2,7 @@ { "name": "@hookdeck/outpost-sdk", - "version": "1.6.0", + "version": "1.6.1", "exports": { ".": "./src/index.ts", "./models/errors": "./src/models/errors/index.ts", diff --git a/sdks/outpost-typescript/package-lock.json b/sdks/outpost-typescript/package-lock.json index e9c996185..e92c1e24c 100644 --- a/sdks/outpost-typescript/package-lock.json +++ b/sdks/outpost-typescript/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hookdeck/outpost-sdk", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hookdeck/outpost-sdk", - "version": "1.6.0", + "version": "1.6.1", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "zod": "^3.25.0 || ^4.0.0" diff --git a/sdks/outpost-typescript/package.json b/sdks/outpost-typescript/package.json index da6b7aa37..e474029f8 100644 --- a/sdks/outpost-typescript/package.json +++ b/sdks/outpost-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@hookdeck/outpost-sdk", - "version": "1.6.0", + "version": "1.6.1", "author": "Speakeasy", "type": "module", "bin": { diff --git a/sdks/outpost-typescript/src/funcs/metricsGetAttemptMetrics.ts b/sdks/outpost-typescript/src/funcs/metricsGetAttemptMetrics.ts index 60559220d..49d0a3816 100644 --- a/sdks/outpost-typescript/src/funcs/metricsGetAttemptMetrics.ts +++ b/sdks/outpost-typescript/src/funcs/metricsGetAttemptMetrics.ts @@ -40,7 +40,11 @@ import { Result } from "../types/fp.js"; * * **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, * `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, - * `rate`, `successful_rate`, `failed_rate` + * `rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + * + * Latency measures are in milliseconds and computed over attempts that recorded a + * latency (see `latency_ms` on the attempt object). They are `null` for a bucket + * with no such attempts, rather than `0`. * * **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` * diff --git a/sdks/outpost-typescript/src/lib/config.ts b/sdks/outpost-typescript/src/lib/config.ts index 9381fc3a7..55ac18b10 100644 --- a/sdks/outpost-typescript/src/lib/config.ts +++ b/sdks/outpost-typescript/src/lib/config.ts @@ -65,8 +65,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null { export const SDK_METADATA = { language: "typescript", openapiDocVersion: "0.0.1", - sdkVersion: "1.6.0", + sdkVersion: "1.6.1", genVersion: "2.938.0", userAgent: - "speakeasy-sdk/typescript 1.6.0 2.938.0 0.0.1 @hookdeck/outpost-sdk", + "speakeasy-sdk/typescript 1.6.1 2.938.0 0.0.1 @hookdeck/outpost-sdk", } as const; diff --git a/sdks/outpost-typescript/src/mcp-server/mcp-server.ts b/sdks/outpost-typescript/src/mcp-server/mcp-server.ts index 6849acff1..9bb415546 100644 --- a/sdks/outpost-typescript/src/mcp-server/mcp-server.ts +++ b/sdks/outpost-typescript/src/mcp-server/mcp-server.ts @@ -19,7 +19,7 @@ const routes = buildRouteMap({ export const app = buildApplication(routes, { name: "mcp", versionInfo: { - currentVersion: "1.6.0", + currentVersion: "1.6.1", }, }); diff --git a/sdks/outpost-typescript/src/mcp-server/server.ts b/sdks/outpost-typescript/src/mcp-server/server.ts index 1e8af0b39..abb480584 100644 --- a/sdks/outpost-typescript/src/mcp-server/server.ts +++ b/sdks/outpost-typescript/src/mcp-server/server.ts @@ -53,7 +53,7 @@ export function createMCPServer(deps: { }) { const server = new McpServer({ name: "Outpost", - version: "1.6.0", + version: "1.6.1", }); const client = new OutpostCore({ diff --git a/sdks/outpost-typescript/src/mcp-server/tools/metricsGetAttemptMetrics.ts b/sdks/outpost-typescript/src/mcp-server/tools/metricsGetAttemptMetrics.ts index 44913cd53..9c830d09a 100644 --- a/sdks/outpost-typescript/src/mcp-server/tools/metricsGetAttemptMetrics.ts +++ b/sdks/outpost-typescript/src/mcp-server/tools/metricsGetAttemptMetrics.ts @@ -19,7 +19,11 @@ dimensional grouping, and filtering. **Measures:** \`count\`, \`successful_count\`, \`failed_count\`, \`error_rate\`, \`first_attempt_count\`, \`retry_count\`, \`manual_retry_count\`, \`avg_attempt_number\`, -\`rate\`, \`successful_rate\`, \`failed_rate\` +\`rate\`, \`successful_rate\`, \`failed_rate\`, \`avg_latency\`, \`p50_latency\`, \`p95_latency\`, \`p99_latency\` + +Latency measures are in milliseconds and computed over attempts that recorded a +latency (see \`latency_ms\` on the attempt object). They are \`null\` for a bucket +with no such attempts, rather than \`0\`. **Dimensions:** \`tenant_id\` (admin-only), \`destination_id\`, \`destination_type\`, \`topic\`, \`status\`, \`code\`, \`manual\`, \`attempt_number\` diff --git a/sdks/outpost-typescript/src/models/components/attempt.ts b/sdks/outpost-typescript/src/models/components/attempt.ts index f87ca5609..8096c7dca 100644 --- a/sdks/outpost-typescript/src/models/components/attempt.ts +++ b/sdks/outpost-typescript/src/models/components/attempt.ts @@ -122,6 +122,10 @@ export type Attempt = { * Whether this attempt was manually triggered (e.g., a retry initiated by a user). */ manual?: boolean | undefined; + /** + * Time in milliseconds from sending the attempt to receiving the destination's response (or the error), measured around the provider's publish call. Null for attempts that never reached the provider and for attempts recorded before latency was tracked. + */ + latencyMs?: number | null | undefined; /** * The ID of the associated event. */ @@ -326,6 +330,7 @@ export const Attempt$inboundSchema: z.ZodType = response_data: z.nullable(z.record(z.any())).optional(), attempt_number: z.number().int().optional(), manual: z.boolean().optional(), + latency_ms: z.nullable(z.number().int()).optional(), event_id: z.string().optional(), destination_id: z.string().optional(), event: z.nullable( @@ -340,6 +345,7 @@ export const Attempt$inboundSchema: z.ZodType = "tenant_id": "tenantId", "response_data": "responseData", "attempt_number": "attemptNumber", + "latency_ms": "latencyMs", "event_id": "eventId", "destination_id": "destinationId", }); @@ -354,6 +360,7 @@ export type Attempt$Outbound = { response_data?: { [k: string]: any } | null | undefined; attempt_number?: number | undefined; manual?: boolean | undefined; + latency_ms?: number | null | undefined; event_id?: string | undefined; destination_id?: string | undefined; event?: EventFull$Outbound | EventSummary$Outbound | null | undefined; @@ -374,6 +381,7 @@ export const Attempt$outboundSchema: z.ZodType< responseData: z.nullable(z.record(z.any())).optional(), attemptNumber: z.number().int().optional(), manual: z.boolean().optional(), + latencyMs: z.nullable(z.number().int()).optional(), eventId: z.string().optional(), destinationId: z.string().optional(), event: z.nullable( @@ -388,6 +396,7 @@ export const Attempt$outboundSchema: z.ZodType< tenantId: "tenant_id", responseData: "response_data", attemptNumber: "attempt_number", + latencyMs: "latency_ms", eventId: "event_id", destinationId: "destination_id", }); diff --git a/sdks/outpost-typescript/src/models/operations/getattemptmetrics.ts b/sdks/outpost-typescript/src/models/operations/getattemptmetrics.ts index aef39ef18..a08ecd7a2 100644 --- a/sdks/outpost-typescript/src/models/operations/getattemptmetrics.ts +++ b/sdks/outpost-typescript/src/models/operations/getattemptmetrics.ts @@ -36,6 +36,10 @@ export const GetAttemptMetricsMeasuresEnum2 = { Rate: "rate", SuccessfulRate: "successful_rate", FailedRate: "failed_rate", + AvgLatency: "avg_latency", + P50Latency: "p50_latency", + P95Latency: "p95_latency", + P99Latency: "p99_latency", } as const; export type GetAttemptMetricsMeasuresEnum2 = ClosedEnum< typeof GetAttemptMetricsMeasuresEnum2 @@ -53,13 +57,17 @@ export const GetAttemptMetricsMeasuresEnum1 = { Rate: "rate", SuccessfulRate: "successful_rate", FailedRate: "failed_rate", + AvgLatency: "avg_latency", + P50Latency: "p50_latency", + P95Latency: "p95_latency", + P99Latency: "p99_latency", } as const; export type GetAttemptMetricsMeasuresEnum1 = ClosedEnum< typeof GetAttemptMetricsMeasuresEnum1 >; /** - * Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). + * Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). */ export type GetAttemptMetricsMeasuresUnion = | GetAttemptMetricsMeasuresEnum1 @@ -175,7 +183,7 @@ export type GetAttemptMetricsRequest = { */ granularity?: string | undefined; /** - * Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). + * Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Latency measures (`avg_latency`, `p50_latency`, `p95_latency`, `p99_latency`) are destination response times in milliseconds, `null` when no attempt in the bucket recorded a latency. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). */ measures: | GetAttemptMetricsMeasuresEnum1 diff --git a/sdks/outpost-typescript/src/sdk/metrics.ts b/sdks/outpost-typescript/src/sdk/metrics.ts index 90c477cb3..2dc907eca 100644 --- a/sdks/outpost-typescript/src/sdk/metrics.ts +++ b/sdks/outpost-typescript/src/sdk/metrics.ts @@ -43,7 +43,11 @@ export class Metrics extends ClientSDK { * * **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`, * `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`, - * `rate`, `successful_rate`, `failed_rate` + * `rate`, `successful_rate`, `failed_rate`, `avg_latency`, `p50_latency`, `p95_latency`, `p99_latency` + * + * Latency measures are in milliseconds and computed over attempts that recorded a + * latency (see `latency_ms` on the attempt object). They are `null` for a bucket + * with no such attempts, rather than `0`. * * **Dimensions:** `tenant_id` (admin-only), `destination_id`, `destination_type`, `topic`, `status`, `code`, `manual`, `attempt_number` *