openmeter 1.0.0b53__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of openmeter might be problematic. Click here for more details.
- openmeter/__init__.py +89 -15
- openmeter/_base_client.py +2041 -0
- openmeter/_client.py +518 -70
- openmeter/_compat.py +221 -0
- openmeter/_constants.py +14 -0
- openmeter/_exceptions.py +108 -0
- openmeter/_files.py +127 -0
- openmeter/_models.py +777 -0
- openmeter/_qs.py +150 -0
- openmeter/_resource.py +43 -0
- openmeter/_response.py +820 -0
- openmeter/_streaming.py +333 -0
- openmeter/_types.py +222 -0
- openmeter/_utils/__init__.py +56 -0
- openmeter/_utils/_logs.py +25 -0
- openmeter/_utils/_proxy.py +63 -0
- openmeter/_utils/_reflection.py +42 -0
- openmeter/_utils/_streams.py +12 -0
- openmeter/_utils/_sync.py +81 -0
- openmeter/_utils/_transform.py +387 -0
- openmeter/_utils/_typing.py +120 -0
- openmeter/_utils/_utils.py +419 -0
- openmeter/_version.py +4 -0
- openmeter/lib/.keep +4 -0
- openmeter/py.typed +0 -1
- openmeter/resources/__init__.py +103 -0
- openmeter/resources/debug/__init__.py +33 -0
- openmeter/resources/debug/debug.py +102 -0
- openmeter/resources/debug/metrics.py +146 -0
- openmeter/resources/entitlements/__init__.py +47 -0
- openmeter/resources/entitlements/entitlements.py +450 -0
- openmeter/resources/entitlements/features.py +578 -0
- openmeter/resources/entitlements/grants.py +389 -0
- openmeter/resources/events.py +442 -0
- openmeter/resources/meters/__init__.py +33 -0
- openmeter/resources/meters/meters.py +666 -0
- openmeter/resources/meters/subjects.py +163 -0
- openmeter/resources/notifications/__init__.py +75 -0
- openmeter/resources/notifications/channels.py +686 -0
- openmeter/resources/notifications/events.py +365 -0
- openmeter/resources/notifications/notifications.py +198 -0
- openmeter/resources/notifications/rules.py +781 -0
- openmeter/resources/notifications/webhook.py +208 -0
- openmeter/resources/portal/__init__.py +47 -0
- openmeter/resources/portal/meters.py +230 -0
- openmeter/resources/portal/portal.py +112 -0
- openmeter/resources/portal/tokens.py +359 -0
- openmeter/resources/subjects/entitlements/__init__.py +33 -0
- openmeter/resources/subjects/entitlements/entitlements.py +1881 -0
- openmeter/resources/subjects/entitlements/grants.py +453 -0
- openmeter/resources/subjects.py +419 -0
- openmeter/types/__init__.py +21 -0
- openmeter/types/debug/__init__.py +5 -0
- openmeter/types/debug/metric_list_response.py +7 -0
- openmeter/types/entitlement.py +238 -0
- openmeter/types/entitlements/__init__.py +11 -0
- openmeter/types/entitlements/feature.py +61 -0
- openmeter/types/entitlements/feature_create_params.py +43 -0
- openmeter/types/entitlements/feature_list_params.py +23 -0
- openmeter/types/entitlements/grant_list_params.py +57 -0
- openmeter/types/entitlements/grant_list_response.py +11 -0
- openmeter/types/entitlements/grant_paginated_response.py +24 -0
- openmeter/types/entitlements/list_features_result.py +28 -0
- openmeter/types/event_ingest_params.py +46 -0
- openmeter/types/event_ingest_response.py +43 -0
- openmeter/types/event_list_params.py +22 -0
- openmeter/types/event_list_response.py +9 -0
- openmeter/types/ingested_event.py +59 -0
- openmeter/types/list_entitlements_result.py +28 -0
- openmeter/types/meter.py +53 -0
- openmeter/types/meter_create_params.py +50 -0
- openmeter/types/meter_list_response.py +9 -0
- openmeter/types/meter_query_params.py +50 -0
- openmeter/types/meter_query_result.py +35 -0
- openmeter/types/meters/__init__.py +5 -0
- openmeter/types/meters/subject_list_response.py +8 -0
- openmeter/types/notifications/__init__.py +18 -0
- openmeter/types/notifications/channel_create_params.py +34 -0
- openmeter/types/notifications/channel_list_params.py +41 -0
- openmeter/types/notifications/channel_list_response.py +24 -0
- openmeter/types/notifications/channel_update_params.py +34 -0
- openmeter/types/notifications/event_list_params.py +61 -0
- openmeter/types/notifications/event_list_response.py +24 -0
- openmeter/types/notifications/notification_channel.py +47 -0
- openmeter/types/notifications/notification_event.py +215 -0
- openmeter/types/notifications/notification_rule.py +70 -0
- openmeter/types/notifications/rule_create_params.py +39 -0
- openmeter/types/notifications/rule_list_params.py +54 -0
- openmeter/types/notifications/rule_list_response.py +24 -0
- openmeter/types/notifications/rule_update_params.py +39 -0
- openmeter/types/notifications/webhook_svix_params.py +26 -0
- openmeter/types/portal/__init__.py +10 -0
- openmeter/types/portal/meter_query_params.py +44 -0
- openmeter/types/portal/portal_token.py +28 -0
- openmeter/types/portal/token_create_params.py +17 -0
- openmeter/types/portal/token_invalidate_params.py +15 -0
- openmeter/types/portal/token_list_params.py +12 -0
- openmeter/types/portal/token_list_response.py +9 -0
- openmeter/types/shared/__init__.py +3 -0
- openmeter/types/subject.py +37 -0
- openmeter/types/subject_list_response.py +9 -0
- openmeter/types/subject_param.py +27 -0
- openmeter/types/subject_upsert_params.py +39 -0
- openmeter/types/subject_upsert_response.py +10 -0
- openmeter/types/subjects/__init__.py +13 -0
- openmeter/types/subjects/entitlement_history_params.py +35 -0
- openmeter/types/subjects/entitlement_history_response.py +98 -0
- openmeter/types/subjects/entitlement_list_response.py +10 -0
- openmeter/types/subjects/entitlements/__init__.py +8 -0
- openmeter/types/subjects/entitlements/entitlement_grant.py +103 -0
- openmeter/types/subjects/entitlements/grant_list_response.py +10 -0
- openmeter-2.0.0.dist-info/METADATA +396 -0
- openmeter-2.0.0.dist-info/RECORD +115 -0
- {openmeter-1.0.0b53.dist-info → openmeter-2.0.0.dist-info}/WHEEL +1 -1
- openmeter-2.0.0.dist-info/licenses/LICENSE +201 -0
- openmeter/_configuration.py +0 -36
- openmeter/_operations/__init__.py +0 -17
- openmeter/_operations/_operations.py +0 -2098
- openmeter/_operations/_patch.py +0 -20
- openmeter/_patch.py +0 -20
- openmeter/_serialization.py +0 -2008
- openmeter/_vendor.py +0 -24
- openmeter/aio/__init__.py +0 -21
- openmeter/aio/_client.py +0 -83
- openmeter/aio/_configuration.py +0 -36
- openmeter/aio/_operations/__init__.py +0 -17
- openmeter/aio/_operations/_operations.py +0 -1771
- openmeter/aio/_operations/_patch.py +0 -20
- openmeter/aio/_patch.py +0 -20
- openmeter/aio/_vendor.py +0 -24
- openmeter-1.0.0b53.dist-info/METADATA +0 -92
- openmeter-1.0.0b53.dist-info/RECORD +0 -21
|
@@ -0,0 +1,666 @@
|
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Dict, List, Union
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from typing_extensions import Literal
|
|
8
|
+
|
|
9
|
+
import httpx
|
|
10
|
+
|
|
11
|
+
from ...types import meter_query_params, meter_create_params
|
|
12
|
+
from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven
|
|
13
|
+
from ..._utils import (
|
|
14
|
+
maybe_transform,
|
|
15
|
+
async_maybe_transform,
|
|
16
|
+
)
|
|
17
|
+
from .subjects import (
|
|
18
|
+
SubjectsResource,
|
|
19
|
+
AsyncSubjectsResource,
|
|
20
|
+
SubjectsResourceWithRawResponse,
|
|
21
|
+
AsyncSubjectsResourceWithRawResponse,
|
|
22
|
+
SubjectsResourceWithStreamingResponse,
|
|
23
|
+
AsyncSubjectsResourceWithStreamingResponse,
|
|
24
|
+
)
|
|
25
|
+
from ..._compat import cached_property
|
|
26
|
+
from ..._resource import SyncAPIResource, AsyncAPIResource
|
|
27
|
+
from ..._response import (
|
|
28
|
+
to_raw_response_wrapper,
|
|
29
|
+
to_streamed_response_wrapper,
|
|
30
|
+
async_to_raw_response_wrapper,
|
|
31
|
+
async_to_streamed_response_wrapper,
|
|
32
|
+
)
|
|
33
|
+
from ...types.meter import Meter
|
|
34
|
+
from ..._base_client import make_request_options
|
|
35
|
+
from ...types.meter_query_result import MeterQueryResult
|
|
36
|
+
from ...types.meter_list_response import MeterListResponse
|
|
37
|
+
|
|
38
|
+
__all__ = ["MetersResource", "AsyncMetersResource"]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class MetersResource(SyncAPIResource):
|
|
42
|
+
@cached_property
|
|
43
|
+
def subjects(self) -> SubjectsResource:
|
|
44
|
+
return SubjectsResource(self._client)
|
|
45
|
+
|
|
46
|
+
@cached_property
|
|
47
|
+
def with_raw_response(self) -> MetersResourceWithRawResponse:
|
|
48
|
+
"""
|
|
49
|
+
This property can be used as a prefix for any HTTP method call to return the
|
|
50
|
+
the raw response object instead of the parsed content.
|
|
51
|
+
|
|
52
|
+
For more information, see https://www.github.com/openmeterio/openmeter-python#accessing-raw-response-data-eg-headers
|
|
53
|
+
"""
|
|
54
|
+
return MetersResourceWithRawResponse(self)
|
|
55
|
+
|
|
56
|
+
@cached_property
|
|
57
|
+
def with_streaming_response(self) -> MetersResourceWithStreamingResponse:
|
|
58
|
+
"""
|
|
59
|
+
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
|
|
60
|
+
|
|
61
|
+
For more information, see https://www.github.com/openmeterio/openmeter-python#with_streaming_response
|
|
62
|
+
"""
|
|
63
|
+
return MetersResourceWithStreamingResponse(self)
|
|
64
|
+
|
|
65
|
+
def create(
|
|
66
|
+
self,
|
|
67
|
+
*,
|
|
68
|
+
aggregation: Literal["SUM", "COUNT", "UNIQUE_COUNT", "AVG", "MIN", "MAX"],
|
|
69
|
+
event_type: str,
|
|
70
|
+
slug: str,
|
|
71
|
+
window_size: Literal["MINUTE", "HOUR", "DAY"],
|
|
72
|
+
description: str | NotGiven = NOT_GIVEN,
|
|
73
|
+
group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
|
|
74
|
+
value_property: str | NotGiven = NOT_GIVEN,
|
|
75
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
76
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
77
|
+
extra_headers: Headers | None = None,
|
|
78
|
+
extra_query: Query | None = None,
|
|
79
|
+
extra_body: Body | None = None,
|
|
80
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
81
|
+
) -> Meter:
|
|
82
|
+
"""
|
|
83
|
+
Create a meter.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
aggregation: The aggregation type to use for the meter.
|
|
87
|
+
|
|
88
|
+
event_type: The event type to aggregate.
|
|
89
|
+
|
|
90
|
+
slug: A unique, human-readable identifier for the meter. Must consist only
|
|
91
|
+
alphanumeric and underscore characters.
|
|
92
|
+
|
|
93
|
+
window_size: Aggregation window size.
|
|
94
|
+
|
|
95
|
+
description: A description of the meter.
|
|
96
|
+
|
|
97
|
+
group_by: Named JSONPath expressions to extract the group by values from the event data.
|
|
98
|
+
|
|
99
|
+
Keys must be unique and consist only alphanumeric and underscore characters.
|
|
100
|
+
|
|
101
|
+
TODO: add key format enforcement
|
|
102
|
+
|
|
103
|
+
value_property: JSONPath expression to extract the value from the ingested event's data
|
|
104
|
+
property.
|
|
105
|
+
|
|
106
|
+
The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a
|
|
107
|
+
string that can be parsed to a number.
|
|
108
|
+
|
|
109
|
+
For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT
|
|
110
|
+
aggregation the valueProperty is ignored.
|
|
111
|
+
|
|
112
|
+
extra_headers: Send extra headers
|
|
113
|
+
|
|
114
|
+
extra_query: Add additional query parameters to the request
|
|
115
|
+
|
|
116
|
+
extra_body: Add additional JSON properties to the request
|
|
117
|
+
|
|
118
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
119
|
+
"""
|
|
120
|
+
return self._post(
|
|
121
|
+
"/api/v1/meters",
|
|
122
|
+
body=maybe_transform(
|
|
123
|
+
{
|
|
124
|
+
"aggregation": aggregation,
|
|
125
|
+
"event_type": event_type,
|
|
126
|
+
"slug": slug,
|
|
127
|
+
"window_size": window_size,
|
|
128
|
+
"description": description,
|
|
129
|
+
"group_by": group_by,
|
|
130
|
+
"value_property": value_property,
|
|
131
|
+
},
|
|
132
|
+
meter_create_params.MeterCreateParams,
|
|
133
|
+
),
|
|
134
|
+
options=make_request_options(
|
|
135
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
136
|
+
),
|
|
137
|
+
cast_to=Meter,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def retrieve(
|
|
141
|
+
self,
|
|
142
|
+
meter_id_or_slug: str,
|
|
143
|
+
*,
|
|
144
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
145
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
146
|
+
extra_headers: Headers | None = None,
|
|
147
|
+
extra_query: Query | None = None,
|
|
148
|
+
extra_body: Body | None = None,
|
|
149
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
150
|
+
) -> Meter:
|
|
151
|
+
"""
|
|
152
|
+
Get a meter by ID or slug.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
extra_headers: Send extra headers
|
|
156
|
+
|
|
157
|
+
extra_query: Add additional query parameters to the request
|
|
158
|
+
|
|
159
|
+
extra_body: Add additional JSON properties to the request
|
|
160
|
+
|
|
161
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
162
|
+
"""
|
|
163
|
+
if not meter_id_or_slug:
|
|
164
|
+
raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
|
|
165
|
+
return self._get(
|
|
166
|
+
f"/api/v1/meters/{meter_id_or_slug}",
|
|
167
|
+
options=make_request_options(
|
|
168
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
169
|
+
),
|
|
170
|
+
cast_to=Meter,
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
def list(
|
|
174
|
+
self,
|
|
175
|
+
*,
|
|
176
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
177
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
178
|
+
extra_headers: Headers | None = None,
|
|
179
|
+
extra_query: Query | None = None,
|
|
180
|
+
extra_body: Body | None = None,
|
|
181
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
182
|
+
) -> MeterListResponse:
|
|
183
|
+
"""List meters."""
|
|
184
|
+
return self._get(
|
|
185
|
+
"/api/v1/meters",
|
|
186
|
+
options=make_request_options(
|
|
187
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
188
|
+
),
|
|
189
|
+
cast_to=MeterListResponse,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
def delete(
|
|
193
|
+
self,
|
|
194
|
+
meter_id_or_slug: str,
|
|
195
|
+
*,
|
|
196
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
197
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
198
|
+
extra_headers: Headers | None = None,
|
|
199
|
+
extra_query: Query | None = None,
|
|
200
|
+
extra_body: Body | None = None,
|
|
201
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
202
|
+
) -> None:
|
|
203
|
+
"""
|
|
204
|
+
Delete a meter.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
extra_headers: Send extra headers
|
|
208
|
+
|
|
209
|
+
extra_query: Add additional query parameters to the request
|
|
210
|
+
|
|
211
|
+
extra_body: Add additional JSON properties to the request
|
|
212
|
+
|
|
213
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
214
|
+
"""
|
|
215
|
+
if not meter_id_or_slug:
|
|
216
|
+
raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
|
|
217
|
+
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
|
|
218
|
+
return self._delete(
|
|
219
|
+
f"/api/v1/meters/{meter_id_or_slug}",
|
|
220
|
+
options=make_request_options(
|
|
221
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
222
|
+
),
|
|
223
|
+
cast_to=NoneType,
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
def query(
|
|
227
|
+
self,
|
|
228
|
+
meter_id_or_slug: str,
|
|
229
|
+
*,
|
|
230
|
+
filter_group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
|
|
231
|
+
from_: Union[str, datetime] | NotGiven = NOT_GIVEN,
|
|
232
|
+
group_by: List[str] | NotGiven = NOT_GIVEN,
|
|
233
|
+
subject: List[str] | NotGiven = NOT_GIVEN,
|
|
234
|
+
to: Union[str, datetime] | NotGiven = NOT_GIVEN,
|
|
235
|
+
window_size: Literal["MINUTE", "HOUR", "DAY"] | NotGiven = NOT_GIVEN,
|
|
236
|
+
window_time_zone: str | NotGiven = NOT_GIVEN,
|
|
237
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
238
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
239
|
+
extra_headers: Headers | None = None,
|
|
240
|
+
extra_query: Query | None = None,
|
|
241
|
+
extra_body: Body | None = None,
|
|
242
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
243
|
+
) -> MeterQueryResult:
|
|
244
|
+
"""Query meter for usage.
|
|
245
|
+
|
|
246
|
+
Query meter for usage.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
filter_group_by: Simple filter for group bys with exact match.
|
|
250
|
+
|
|
251
|
+
from_: Start date-time in RFC 3339 format.
|
|
252
|
+
|
|
253
|
+
Inclusive.
|
|
254
|
+
|
|
255
|
+
group_by: If not specified a single aggregate will be returned for each subject and time
|
|
256
|
+
window. `subject` is a reserved group by value.
|
|
257
|
+
|
|
258
|
+
subject: Filtering by multiple subjects.
|
|
259
|
+
|
|
260
|
+
to: End date-time in RFC 3339 format.
|
|
261
|
+
|
|
262
|
+
Inclusive.
|
|
263
|
+
|
|
264
|
+
window_size: If not specified, a single usage aggregate will be returned for the entirety of
|
|
265
|
+
the specified period for each subject and group.
|
|
266
|
+
|
|
267
|
+
window_time_zone: The value is the name of the time zone as defined in the IANA Time Zone Database
|
|
268
|
+
(http://www.iana.org/time-zones). If not specified, the UTC timezone will be
|
|
269
|
+
used.
|
|
270
|
+
|
|
271
|
+
extra_headers: Send extra headers
|
|
272
|
+
|
|
273
|
+
extra_query: Add additional query parameters to the request
|
|
274
|
+
|
|
275
|
+
extra_body: Add additional JSON properties to the request
|
|
276
|
+
|
|
277
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
278
|
+
"""
|
|
279
|
+
if not meter_id_or_slug:
|
|
280
|
+
raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
|
|
281
|
+
return self._get(
|
|
282
|
+
f"/api/v1/meters/{meter_id_or_slug}/query",
|
|
283
|
+
options=make_request_options(
|
|
284
|
+
extra_headers=extra_headers,
|
|
285
|
+
extra_query=extra_query,
|
|
286
|
+
extra_body=extra_body,
|
|
287
|
+
timeout=timeout,
|
|
288
|
+
query=maybe_transform(
|
|
289
|
+
{
|
|
290
|
+
"filter_group_by": filter_group_by,
|
|
291
|
+
"from_": from_,
|
|
292
|
+
"group_by": group_by,
|
|
293
|
+
"subject": subject,
|
|
294
|
+
"to": to,
|
|
295
|
+
"window_size": window_size,
|
|
296
|
+
"window_time_zone": window_time_zone,
|
|
297
|
+
},
|
|
298
|
+
meter_query_params.MeterQueryParams,
|
|
299
|
+
),
|
|
300
|
+
),
|
|
301
|
+
cast_to=MeterQueryResult,
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class AsyncMetersResource(AsyncAPIResource):
|
|
306
|
+
@cached_property
|
|
307
|
+
def subjects(self) -> AsyncSubjectsResource:
|
|
308
|
+
return AsyncSubjectsResource(self._client)
|
|
309
|
+
|
|
310
|
+
@cached_property
|
|
311
|
+
def with_raw_response(self) -> AsyncMetersResourceWithRawResponse:
|
|
312
|
+
"""
|
|
313
|
+
This property can be used as a prefix for any HTTP method call to return the
|
|
314
|
+
the raw response object instead of the parsed content.
|
|
315
|
+
|
|
316
|
+
For more information, see https://www.github.com/openmeterio/openmeter-python#accessing-raw-response-data-eg-headers
|
|
317
|
+
"""
|
|
318
|
+
return AsyncMetersResourceWithRawResponse(self)
|
|
319
|
+
|
|
320
|
+
@cached_property
|
|
321
|
+
def with_streaming_response(self) -> AsyncMetersResourceWithStreamingResponse:
|
|
322
|
+
"""
|
|
323
|
+
An alternative to `.with_raw_response` that doesn't eagerly read the response body.
|
|
324
|
+
|
|
325
|
+
For more information, see https://www.github.com/openmeterio/openmeter-python#with_streaming_response
|
|
326
|
+
"""
|
|
327
|
+
return AsyncMetersResourceWithStreamingResponse(self)
|
|
328
|
+
|
|
329
|
+
async def create(
|
|
330
|
+
self,
|
|
331
|
+
*,
|
|
332
|
+
aggregation: Literal["SUM", "COUNT", "UNIQUE_COUNT", "AVG", "MIN", "MAX"],
|
|
333
|
+
event_type: str,
|
|
334
|
+
slug: str,
|
|
335
|
+
window_size: Literal["MINUTE", "HOUR", "DAY"],
|
|
336
|
+
description: str | NotGiven = NOT_GIVEN,
|
|
337
|
+
group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
|
|
338
|
+
value_property: str | NotGiven = NOT_GIVEN,
|
|
339
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
340
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
341
|
+
extra_headers: Headers | None = None,
|
|
342
|
+
extra_query: Query | None = None,
|
|
343
|
+
extra_body: Body | None = None,
|
|
344
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
345
|
+
) -> Meter:
|
|
346
|
+
"""
|
|
347
|
+
Create a meter.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
aggregation: The aggregation type to use for the meter.
|
|
351
|
+
|
|
352
|
+
event_type: The event type to aggregate.
|
|
353
|
+
|
|
354
|
+
slug: A unique, human-readable identifier for the meter. Must consist only
|
|
355
|
+
alphanumeric and underscore characters.
|
|
356
|
+
|
|
357
|
+
window_size: Aggregation window size.
|
|
358
|
+
|
|
359
|
+
description: A description of the meter.
|
|
360
|
+
|
|
361
|
+
group_by: Named JSONPath expressions to extract the group by values from the event data.
|
|
362
|
+
|
|
363
|
+
Keys must be unique and consist only alphanumeric and underscore characters.
|
|
364
|
+
|
|
365
|
+
TODO: add key format enforcement
|
|
366
|
+
|
|
367
|
+
value_property: JSONPath expression to extract the value from the ingested event's data
|
|
368
|
+
property.
|
|
369
|
+
|
|
370
|
+
The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a
|
|
371
|
+
string that can be parsed to a number.
|
|
372
|
+
|
|
373
|
+
For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT
|
|
374
|
+
aggregation the valueProperty is ignored.
|
|
375
|
+
|
|
376
|
+
extra_headers: Send extra headers
|
|
377
|
+
|
|
378
|
+
extra_query: Add additional query parameters to the request
|
|
379
|
+
|
|
380
|
+
extra_body: Add additional JSON properties to the request
|
|
381
|
+
|
|
382
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
383
|
+
"""
|
|
384
|
+
return await self._post(
|
|
385
|
+
"/api/v1/meters",
|
|
386
|
+
body=await async_maybe_transform(
|
|
387
|
+
{
|
|
388
|
+
"aggregation": aggregation,
|
|
389
|
+
"event_type": event_type,
|
|
390
|
+
"slug": slug,
|
|
391
|
+
"window_size": window_size,
|
|
392
|
+
"description": description,
|
|
393
|
+
"group_by": group_by,
|
|
394
|
+
"value_property": value_property,
|
|
395
|
+
},
|
|
396
|
+
meter_create_params.MeterCreateParams,
|
|
397
|
+
),
|
|
398
|
+
options=make_request_options(
|
|
399
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
400
|
+
),
|
|
401
|
+
cast_to=Meter,
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
async def retrieve(
|
|
405
|
+
self,
|
|
406
|
+
meter_id_or_slug: str,
|
|
407
|
+
*,
|
|
408
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
409
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
410
|
+
extra_headers: Headers | None = None,
|
|
411
|
+
extra_query: Query | None = None,
|
|
412
|
+
extra_body: Body | None = None,
|
|
413
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
414
|
+
) -> Meter:
|
|
415
|
+
"""
|
|
416
|
+
Get a meter by ID or slug.
|
|
417
|
+
|
|
418
|
+
Args:
|
|
419
|
+
extra_headers: Send extra headers
|
|
420
|
+
|
|
421
|
+
extra_query: Add additional query parameters to the request
|
|
422
|
+
|
|
423
|
+
extra_body: Add additional JSON properties to the request
|
|
424
|
+
|
|
425
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
426
|
+
"""
|
|
427
|
+
if not meter_id_or_slug:
|
|
428
|
+
raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
|
|
429
|
+
return await self._get(
|
|
430
|
+
f"/api/v1/meters/{meter_id_or_slug}",
|
|
431
|
+
options=make_request_options(
|
|
432
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
433
|
+
),
|
|
434
|
+
cast_to=Meter,
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
async def list(
|
|
438
|
+
self,
|
|
439
|
+
*,
|
|
440
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
441
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
442
|
+
extra_headers: Headers | None = None,
|
|
443
|
+
extra_query: Query | None = None,
|
|
444
|
+
extra_body: Body | None = None,
|
|
445
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
446
|
+
) -> MeterListResponse:
|
|
447
|
+
"""List meters."""
|
|
448
|
+
return await self._get(
|
|
449
|
+
"/api/v1/meters",
|
|
450
|
+
options=make_request_options(
|
|
451
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
452
|
+
),
|
|
453
|
+
cast_to=MeterListResponse,
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
async def delete(
|
|
457
|
+
self,
|
|
458
|
+
meter_id_or_slug: str,
|
|
459
|
+
*,
|
|
460
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
461
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
462
|
+
extra_headers: Headers | None = None,
|
|
463
|
+
extra_query: Query | None = None,
|
|
464
|
+
extra_body: Body | None = None,
|
|
465
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
466
|
+
) -> None:
|
|
467
|
+
"""
|
|
468
|
+
Delete a meter.
|
|
469
|
+
|
|
470
|
+
Args:
|
|
471
|
+
extra_headers: Send extra headers
|
|
472
|
+
|
|
473
|
+
extra_query: Add additional query parameters to the request
|
|
474
|
+
|
|
475
|
+
extra_body: Add additional JSON properties to the request
|
|
476
|
+
|
|
477
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
478
|
+
"""
|
|
479
|
+
if not meter_id_or_slug:
|
|
480
|
+
raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
|
|
481
|
+
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
|
|
482
|
+
return await self._delete(
|
|
483
|
+
f"/api/v1/meters/{meter_id_or_slug}",
|
|
484
|
+
options=make_request_options(
|
|
485
|
+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
|
|
486
|
+
),
|
|
487
|
+
cast_to=NoneType,
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
async def query(
|
|
491
|
+
self,
|
|
492
|
+
meter_id_or_slug: str,
|
|
493
|
+
*,
|
|
494
|
+
filter_group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
|
|
495
|
+
from_: Union[str, datetime] | NotGiven = NOT_GIVEN,
|
|
496
|
+
group_by: List[str] | NotGiven = NOT_GIVEN,
|
|
497
|
+
subject: List[str] | NotGiven = NOT_GIVEN,
|
|
498
|
+
to: Union[str, datetime] | NotGiven = NOT_GIVEN,
|
|
499
|
+
window_size: Literal["MINUTE", "HOUR", "DAY"] | NotGiven = NOT_GIVEN,
|
|
500
|
+
window_time_zone: str | NotGiven = NOT_GIVEN,
|
|
501
|
+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
502
|
+
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
503
|
+
extra_headers: Headers | None = None,
|
|
504
|
+
extra_query: Query | None = None,
|
|
505
|
+
extra_body: Body | None = None,
|
|
506
|
+
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
|
|
507
|
+
) -> MeterQueryResult:
|
|
508
|
+
"""Query meter for usage.
|
|
509
|
+
|
|
510
|
+
Query meter for usage.
|
|
511
|
+
|
|
512
|
+
Args:
|
|
513
|
+
filter_group_by: Simple filter for group bys with exact match.
|
|
514
|
+
|
|
515
|
+
from_: Start date-time in RFC 3339 format.
|
|
516
|
+
|
|
517
|
+
Inclusive.
|
|
518
|
+
|
|
519
|
+
group_by: If not specified a single aggregate will be returned for each subject and time
|
|
520
|
+
window. `subject` is a reserved group by value.
|
|
521
|
+
|
|
522
|
+
subject: Filtering by multiple subjects.
|
|
523
|
+
|
|
524
|
+
to: End date-time in RFC 3339 format.
|
|
525
|
+
|
|
526
|
+
Inclusive.
|
|
527
|
+
|
|
528
|
+
window_size: If not specified, a single usage aggregate will be returned for the entirety of
|
|
529
|
+
the specified period for each subject and group.
|
|
530
|
+
|
|
531
|
+
window_time_zone: The value is the name of the time zone as defined in the IANA Time Zone Database
|
|
532
|
+
(http://www.iana.org/time-zones). If not specified, the UTC timezone will be
|
|
533
|
+
used.
|
|
534
|
+
|
|
535
|
+
extra_headers: Send extra headers
|
|
536
|
+
|
|
537
|
+
extra_query: Add additional query parameters to the request
|
|
538
|
+
|
|
539
|
+
extra_body: Add additional JSON properties to the request
|
|
540
|
+
|
|
541
|
+
timeout: Override the client-level default timeout for this request, in seconds
|
|
542
|
+
"""
|
|
543
|
+
if not meter_id_or_slug:
|
|
544
|
+
raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
|
|
545
|
+
return await self._get(
|
|
546
|
+
f"/api/v1/meters/{meter_id_or_slug}/query",
|
|
547
|
+
options=make_request_options(
|
|
548
|
+
extra_headers=extra_headers,
|
|
549
|
+
extra_query=extra_query,
|
|
550
|
+
extra_body=extra_body,
|
|
551
|
+
timeout=timeout,
|
|
552
|
+
query=await async_maybe_transform(
|
|
553
|
+
{
|
|
554
|
+
"filter_group_by": filter_group_by,
|
|
555
|
+
"from_": from_,
|
|
556
|
+
"group_by": group_by,
|
|
557
|
+
"subject": subject,
|
|
558
|
+
"to": to,
|
|
559
|
+
"window_size": window_size,
|
|
560
|
+
"window_time_zone": window_time_zone,
|
|
561
|
+
},
|
|
562
|
+
meter_query_params.MeterQueryParams,
|
|
563
|
+
),
|
|
564
|
+
),
|
|
565
|
+
cast_to=MeterQueryResult,
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
class MetersResourceWithRawResponse:
|
|
570
|
+
def __init__(self, meters: MetersResource) -> None:
|
|
571
|
+
self._meters = meters
|
|
572
|
+
|
|
573
|
+
self.create = to_raw_response_wrapper(
|
|
574
|
+
meters.create,
|
|
575
|
+
)
|
|
576
|
+
self.retrieve = to_raw_response_wrapper(
|
|
577
|
+
meters.retrieve,
|
|
578
|
+
)
|
|
579
|
+
self.list = to_raw_response_wrapper(
|
|
580
|
+
meters.list,
|
|
581
|
+
)
|
|
582
|
+
self.delete = to_raw_response_wrapper(
|
|
583
|
+
meters.delete,
|
|
584
|
+
)
|
|
585
|
+
self.query = to_raw_response_wrapper(
|
|
586
|
+
meters.query,
|
|
587
|
+
)
|
|
588
|
+
|
|
589
|
+
@cached_property
|
|
590
|
+
def subjects(self) -> SubjectsResourceWithRawResponse:
|
|
591
|
+
return SubjectsResourceWithRawResponse(self._meters.subjects)
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
class AsyncMetersResourceWithRawResponse:
|
|
595
|
+
def __init__(self, meters: AsyncMetersResource) -> None:
|
|
596
|
+
self._meters = meters
|
|
597
|
+
|
|
598
|
+
self.create = async_to_raw_response_wrapper(
|
|
599
|
+
meters.create,
|
|
600
|
+
)
|
|
601
|
+
self.retrieve = async_to_raw_response_wrapper(
|
|
602
|
+
meters.retrieve,
|
|
603
|
+
)
|
|
604
|
+
self.list = async_to_raw_response_wrapper(
|
|
605
|
+
meters.list,
|
|
606
|
+
)
|
|
607
|
+
self.delete = async_to_raw_response_wrapper(
|
|
608
|
+
meters.delete,
|
|
609
|
+
)
|
|
610
|
+
self.query = async_to_raw_response_wrapper(
|
|
611
|
+
meters.query,
|
|
612
|
+
)
|
|
613
|
+
|
|
614
|
+
@cached_property
|
|
615
|
+
def subjects(self) -> AsyncSubjectsResourceWithRawResponse:
|
|
616
|
+
return AsyncSubjectsResourceWithRawResponse(self._meters.subjects)
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
class MetersResourceWithStreamingResponse:
|
|
620
|
+
def __init__(self, meters: MetersResource) -> None:
|
|
621
|
+
self._meters = meters
|
|
622
|
+
|
|
623
|
+
self.create = to_streamed_response_wrapper(
|
|
624
|
+
meters.create,
|
|
625
|
+
)
|
|
626
|
+
self.retrieve = to_streamed_response_wrapper(
|
|
627
|
+
meters.retrieve,
|
|
628
|
+
)
|
|
629
|
+
self.list = to_streamed_response_wrapper(
|
|
630
|
+
meters.list,
|
|
631
|
+
)
|
|
632
|
+
self.delete = to_streamed_response_wrapper(
|
|
633
|
+
meters.delete,
|
|
634
|
+
)
|
|
635
|
+
self.query = to_streamed_response_wrapper(
|
|
636
|
+
meters.query,
|
|
637
|
+
)
|
|
638
|
+
|
|
639
|
+
@cached_property
|
|
640
|
+
def subjects(self) -> SubjectsResourceWithStreamingResponse:
|
|
641
|
+
return SubjectsResourceWithStreamingResponse(self._meters.subjects)
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
class AsyncMetersResourceWithStreamingResponse:
|
|
645
|
+
def __init__(self, meters: AsyncMetersResource) -> None:
|
|
646
|
+
self._meters = meters
|
|
647
|
+
|
|
648
|
+
self.create = async_to_streamed_response_wrapper(
|
|
649
|
+
meters.create,
|
|
650
|
+
)
|
|
651
|
+
self.retrieve = async_to_streamed_response_wrapper(
|
|
652
|
+
meters.retrieve,
|
|
653
|
+
)
|
|
654
|
+
self.list = async_to_streamed_response_wrapper(
|
|
655
|
+
meters.list,
|
|
656
|
+
)
|
|
657
|
+
self.delete = async_to_streamed_response_wrapper(
|
|
658
|
+
meters.delete,
|
|
659
|
+
)
|
|
660
|
+
self.query = async_to_streamed_response_wrapper(
|
|
661
|
+
meters.query,
|
|
662
|
+
)
|
|
663
|
+
|
|
664
|
+
@cached_property
|
|
665
|
+
def subjects(self) -> AsyncSubjectsResourceWithStreamingResponse:
|
|
666
|
+
return AsyncSubjectsResourceWithStreamingResponse(self._meters.subjects)
|