honeycomb-api 0.1.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.
Files changed (453) hide show
  1. honeycomb/__init__.py +217 -0
  2. honeycomb/_generated/__init__.py +8 -0
  3. honeycomb/_generated/api/__init__.py +1 -0
  4. honeycomb/_generated/api/auth/__init__.py +0 -0
  5. honeycomb/_generated/api/auth/get_auth.py +172 -0
  6. honeycomb/_generated/api/auth/get_v2_auth.py +168 -0
  7. honeycomb/_generated/api/boards/__init__.py +0 -0
  8. honeycomb/_generated/api/boards/create_board.py +217 -0
  9. honeycomb/_generated/api/boards/create_board_view.py +237 -0
  10. honeycomb/_generated/api/boards/delete_board.py +191 -0
  11. honeycomb/_generated/api/boards/delete_board_view.py +210 -0
  12. honeycomb/_generated/api/boards/get_board.py +208 -0
  13. honeycomb/_generated/api/boards/get_board_view.py +214 -0
  14. honeycomb/_generated/api/boards/list_board_views.py +206 -0
  15. honeycomb/_generated/api/boards/list_boards.py +177 -0
  16. honeycomb/_generated/api/boards/update_board.py +238 -0
  17. honeycomb/_generated/api/boards/update_board_view.py +250 -0
  18. honeycomb/_generated/api/burn_alerts/__init__.py +0 -0
  19. honeycomb/_generated/api/burn_alerts/create_burn_alert.py +224 -0
  20. honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +204 -0
  21. honeycomb/_generated/api/burn_alerts/get_burn_alert.py +208 -0
  22. honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +220 -0
  23. honeycomb/_generated/api/calculated_fields/__init__.py +0 -0
  24. honeycomb/_generated/api/calculated_fields/create_calculated_field.py +239 -0
  25. honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +225 -0
  26. honeycomb/_generated/api/calculated_fields/get_calculated_field.py +207 -0
  27. honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +252 -0
  28. honeycomb/_generated/api/calculated_fields/update_calculated_field.py +242 -0
  29. honeycomb/_generated/api/columns/__init__.py +0 -0
  30. honeycomb/_generated/api/columns/create_column.py +241 -0
  31. honeycomb/_generated/api/columns/delete_column.py +221 -0
  32. honeycomb/_generated/api/columns/get_column.py +206 -0
  33. honeycomb/_generated/api/columns/list_columns.py +256 -0
  34. honeycomb/_generated/api/columns/update_column.py +242 -0
  35. honeycomb/_generated/api/dataset_definitions/__init__.py +0 -0
  36. honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +193 -0
  37. honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +235 -0
  38. honeycomb/_generated/api/datasets/__init__.py +0 -0
  39. honeycomb/_generated/api/datasets/create_dataset.py +227 -0
  40. honeycomb/_generated/api/datasets/delete_dataset.py +251 -0
  41. honeycomb/_generated/api/datasets/get_dataset.py +195 -0
  42. honeycomb/_generated/api/datasets/list_datasets.py +177 -0
  43. honeycomb/_generated/api/datasets/update_dataset.py +217 -0
  44. honeycomb/_generated/api/enhance/__init__.py +0 -0
  45. honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +231 -0
  46. honeycomb/_generated/api/environments/__init__.py +0 -0
  47. honeycomb/_generated/api/environments/create_environment.py +247 -0
  48. honeycomb/_generated/api/environments/delete_environment.py +245 -0
  49. honeycomb/_generated/api/environments/get_environment.py +213 -0
  50. honeycomb/_generated/api/environments/list_environments.py +245 -0
  51. honeycomb/_generated/api/environments/update_environment.py +254 -0
  52. honeycomb/_generated/api/events/__init__.py +0 -0
  53. honeycomb/_generated/api/events/create_event.py +269 -0
  54. honeycomb/_generated/api/events/create_events.py +314 -0
  55. honeycomb/_generated/api/key_management/__init__.py +0 -0
  56. honeycomb/_generated/api/key_management/create_api_key.py +286 -0
  57. honeycomb/_generated/api/key_management/delete_api_key.py +223 -0
  58. honeycomb/_generated/api/key_management/get_api_key.py +225 -0
  59. honeycomb/_generated/api/key_management/list_api_keys.py +281 -0
  60. honeycomb/_generated/api/key_management/update_api_key.py +270 -0
  61. honeycomb/_generated/api/kinesis_events/__init__.py +0 -0
  62. honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +220 -0
  63. honeycomb/_generated/api/marker_settings/__init__.py +0 -0
  64. honeycomb/_generated/api/marker_settings/create_marker_setting.py +209 -0
  65. honeycomb/_generated/api/marker_settings/delete_marker_settings.py +194 -0
  66. honeycomb/_generated/api/marker_settings/list_marker_settings.py +186 -0
  67. honeycomb/_generated/api/marker_settings/update_marker_settings.py +230 -0
  68. honeycomb/_generated/api/markers/__init__.py +0 -0
  69. honeycomb/_generated/api/markers/create_marker.py +220 -0
  70. honeycomb/_generated/api/markers/create_marker_v2.py +253 -0
  71. honeycomb/_generated/api/markers/delete_marker.py +200 -0
  72. honeycomb/_generated/api/markers/get_marker.py +194 -0
  73. honeycomb/_generated/api/markers/update_marker.py +233 -0
  74. honeycomb/_generated/api/markers/update_marker_v2.py +262 -0
  75. honeycomb/_generated/api/pipelines/__init__.py +0 -0
  76. honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +306 -0
  77. honeycomb/_generated/api/pipelines/record_pipeline_usage.py +244 -0
  78. honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +261 -0
  79. honeycomb/_generated/api/queries/__init__.py +0 -0
  80. honeycomb/_generated/api/queries/create_query.py +224 -0
  81. honeycomb/_generated/api/queries/get_query.py +208 -0
  82. honeycomb/_generated/api/query_annotations/__init__.py +0 -0
  83. honeycomb/_generated/api/query_annotations/create_query_annotation.py +226 -0
  84. honeycomb/_generated/api/query_annotations/delete_query_annotation.py +198 -0
  85. honeycomb/_generated/api/query_annotations/get_query_annotation.py +202 -0
  86. honeycomb/_generated/api/query_annotations/list_query_annotations.py +217 -0
  87. honeycomb/_generated/api/query_annotations/update_query_annotation.py +237 -0
  88. honeycomb/_generated/api/query_data/__init__.py +0 -0
  89. honeycomb/_generated/api/query_data/create_query_result.py +247 -0
  90. honeycomb/_generated/api/query_data/get_query_result.py +208 -0
  91. honeycomb/_generated/api/recipients/__init__.py +0 -0
  92. honeycomb/_generated/api/recipients/create_recipient.py +317 -0
  93. honeycomb/_generated/api/recipients/delete_recipient.py +199 -0
  94. honeycomb/_generated/api/recipients/get_recipient.py +252 -0
  95. honeycomb/_generated/api/recipients/list_recipients.py +230 -0
  96. honeycomb/_generated/api/recipients/update_recipient.py +323 -0
  97. honeycomb/_generated/api/reporting/__init__.py +0 -0
  98. honeycomb/_generated/api/reporting/get_slo_history.py +218 -0
  99. honeycomb/_generated/api/service_maps/__init__.py +0 -0
  100. honeycomb/_generated/api/service_maps/create_map_dependency_request.py +252 -0
  101. honeycomb/_generated/api/service_maps/get_map_dependencies.py +265 -0
  102. honeycomb/_generated/api/sl_os/__init__.py +0 -0
  103. honeycomb/_generated/api/sl_os/create_slo.py +229 -0
  104. honeycomb/_generated/api/sl_os/delete_slo.py +210 -0
  105. honeycomb/_generated/api/sl_os/get_slo.py +256 -0
  106. honeycomb/_generated/api/sl_os/list_slos.py +210 -0
  107. honeycomb/_generated/api/sl_os/update_slo.py +242 -0
  108. honeycomb/_generated/api/triggers/__init__.py +0 -0
  109. honeycomb/_generated/api/triggers/create_trigger.py +250 -0
  110. honeycomb/_generated/api/triggers/delete_trigger.py +204 -0
  111. honeycomb/_generated/api/triggers/get_trigger.py +214 -0
  112. honeycomb/_generated/api/triggers/list_triggers.py +206 -0
  113. honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +208 -0
  114. honeycomb/_generated/api/triggers/update_trigger.py +248 -0
  115. honeycomb/_generated/client.py +271 -0
  116. honeycomb/_generated/errors.py +14 -0
  117. honeycomb/_generated/models/__init__.py +561 -0
  118. honeycomb/_generated/models/api_key_create_request.py +78 -0
  119. honeycomb/_generated/models/api_key_create_request_data.py +130 -0
  120. honeycomb/_generated/models/api_key_create_request_data_relationships.py +78 -0
  121. honeycomb/_generated/models/api_key_create_request_data_type.py +7 -0
  122. honeycomb/_generated/models/api_key_list_response.py +112 -0
  123. honeycomb/_generated/models/api_key_object.py +189 -0
  124. honeycomb/_generated/models/api_key_object_links.py +74 -0
  125. honeycomb/_generated/models/api_key_object_relationships.py +150 -0
  126. honeycomb/_generated/models/api_key_object_type.py +7 -0
  127. honeycomb/_generated/models/api_key_response.py +78 -0
  128. honeycomb/_generated/models/api_key_update_request.py +104 -0
  129. honeycomb/_generated/models/auth.py +140 -0
  130. honeycomb/_generated/models/auth_api_key_access.py +154 -0
  131. honeycomb/_generated/models/auth_environment.py +82 -0
  132. honeycomb/_generated/models/auth_team.py +82 -0
  133. honeycomb/_generated/models/auth_type.py +8 -0
  134. honeycomb/_generated/models/auth_v2_response.py +108 -0
  135. honeycomb/_generated/models/auth_v2_response_data.py +122 -0
  136. honeycomb/_generated/models/auth_v2_response_data_attributes.py +141 -0
  137. honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +7 -0
  138. honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +107 -0
  139. honeycomb/_generated/models/auth_v2_response_data_relationships.py +59 -0
  140. honeycomb/_generated/models/auth_v2_response_data_type.py +7 -0
  141. honeycomb/_generated/models/base_trigger.py +367 -0
  142. honeycomb/_generated/models/base_trigger_alert_type.py +8 -0
  143. honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +92 -0
  144. honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +10 -0
  145. honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +8 -0
  146. honeycomb/_generated/models/base_trigger_evaluation_schedule.py +83 -0
  147. honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +8 -0
  148. honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +103 -0
  149. honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +13 -0
  150. honeycomb/_generated/models/base_trigger_threshold.py +95 -0
  151. honeycomb/_generated/models/base_trigger_threshold_op.py +10 -0
  152. honeycomb/_generated/models/batch_event.py +110 -0
  153. honeycomb/_generated/models/board.py +276 -0
  154. honeycomb/_generated/models/board_layout_generation.py +8 -0
  155. honeycomb/_generated/models/board_links.py +74 -0
  156. honeycomb/_generated/models/board_panel_position.py +104 -0
  157. honeycomb/_generated/models/board_query_visualization_settings.py +141 -0
  158. honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +113 -0
  159. honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +13 -0
  160. honeycomb/_generated/models/board_type.py +7 -0
  161. honeycomb/_generated/models/board_view_filter.py +93 -0
  162. honeycomb/_generated/models/board_view_filter_operation.py +22 -0
  163. honeycomb/_generated/models/board_view_response.py +111 -0
  164. honeycomb/_generated/models/budget_rate.py +189 -0
  165. honeycomb/_generated/models/budget_rate_alert_type.py +8 -0
  166. honeycomb/_generated/models/burn_alert_shared_params.py +136 -0
  167. honeycomb/_generated/models/calculated_field.py +117 -0
  168. honeycomb/_generated/models/configuration_key_attributes.py +140 -0
  169. honeycomb/_generated/models/configuration_key_attributes_key_type.py +7 -0
  170. honeycomb/_generated/models/configuration_key_attributes_timestamps.py +107 -0
  171. honeycomb/_generated/models/create_board_view_request.py +96 -0
  172. honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +232 -0
  173. honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +74 -0
  174. honeycomb/_generated/models/create_column.py +149 -0
  175. honeycomb/_generated/models/create_column_type.py +11 -0
  176. honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +78 -0
  177. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +90 -0
  178. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +97 -0
  179. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +88 -0
  180. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +89 -0
  181. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +89 -0
  182. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +97 -0
  183. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +102 -0
  184. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +7 -0
  185. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +105 -0
  186. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +87 -0
  187. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +73 -0
  188. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +7 -0
  189. honeycomb/_generated/models/create_environment_request.py +78 -0
  190. honeycomb/_generated/models/create_environment_request_data.py +90 -0
  191. honeycomb/_generated/models/create_environment_request_data_attributes.py +102 -0
  192. honeycomb/_generated/models/create_environment_request_data_type.py +7 -0
  193. honeycomb/_generated/models/create_events_content_encoding.py +8 -0
  194. honeycomb/_generated/models/create_events_response_200_item.py +82 -0
  195. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +217 -0
  196. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +74 -0
  197. honeycomb/_generated/models/create_map_dependencies_request.py +128 -0
  198. honeycomb/_generated/models/create_map_dependencies_response.py +97 -0
  199. honeycomb/_generated/models/create_map_dependencies_response_status.py +9 -0
  200. honeycomb/_generated/models/create_pipeline_health_record_request.py +78 -0
  201. honeycomb/_generated/models/create_pipeline_health_record_request_data.py +98 -0
  202. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +88 -0
  203. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +88 -0
  204. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +89 -0
  205. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +89 -0
  206. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +97 -0
  207. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +102 -0
  208. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +7 -0
  209. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +105 -0
  210. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +87 -0
  211. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +73 -0
  212. honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +7 -0
  213. honeycomb/_generated/models/create_query_result_request.py +118 -0
  214. honeycomb/_generated/models/dataset.py +183 -0
  215. honeycomb/_generated/models/dataset_creation_payload.py +93 -0
  216. honeycomb/_generated/models/dataset_definition_type_1.py +96 -0
  217. honeycomb/_generated/models/dataset_definition_type_1_column_type.py +8 -0
  218. honeycomb/_generated/models/dataset_definitions.py +599 -0
  219. honeycomb/_generated/models/dataset_relationship.py +79 -0
  220. honeycomb/_generated/models/dataset_relationship_data.py +82 -0
  221. honeycomb/_generated/models/dataset_relationship_data_type.py +7 -0
  222. honeycomb/_generated/models/dataset_settings.py +73 -0
  223. honeycomb/_generated/models/dataset_update_payload.py +105 -0
  224. honeycomb/_generated/models/dataset_update_payload_settings.py +73 -0
  225. honeycomb/_generated/models/detailed_error.py +115 -0
  226. honeycomb/_generated/models/email_recipient.py +160 -0
  227. honeycomb/_generated/models/email_recipient_details.py +71 -0
  228. honeycomb/_generated/models/email_recipient_type.py +7 -0
  229. honeycomb/_generated/models/environment.py +112 -0
  230. honeycomb/_generated/models/environment_attributes.py +140 -0
  231. honeycomb/_generated/models/environment_attributes_color_type_1.py +7 -0
  232. honeycomb/_generated/models/environment_attributes_settings.py +70 -0
  233. honeycomb/_generated/models/environment_color.py +16 -0
  234. honeycomb/_generated/models/environment_links.py +70 -0
  235. honeycomb/_generated/models/environment_list_response.py +112 -0
  236. honeycomb/_generated/models/environment_relationship.py +79 -0
  237. honeycomb/_generated/models/environment_relationship_data.py +82 -0
  238. honeycomb/_generated/models/environment_relationship_data_type.py +7 -0
  239. honeycomb/_generated/models/environment_response.py +78 -0
  240. honeycomb/_generated/models/environment_type.py +7 -0
  241. honeycomb/_generated/models/error.py +74 -0
  242. honeycomb/_generated/models/event.py +71 -0
  243. honeycomb/_generated/models/exhaustion_time.py +174 -0
  244. honeycomb/_generated/models/exhaustion_time_alert_type.py +8 -0
  245. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +198 -0
  246. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +77 -0
  247. honeycomb/_generated/models/filter_op.py +22 -0
  248. honeycomb/_generated/models/get_map_dependencies_response.py +169 -0
  249. honeycomb/_generated/models/get_map_dependencies_response_status.py +9 -0
  250. honeycomb/_generated/models/having_calculate_op.py +29 -0
  251. honeycomb/_generated/models/having_op.py +12 -0
  252. honeycomb/_generated/models/included_resource.py +106 -0
  253. honeycomb/_generated/models/included_resource_attributes.py +62 -0
  254. honeycomb/_generated/models/ingest_key_attributes.py +153 -0
  255. honeycomb/_generated/models/ingest_key_attributes_key_type.py +7 -0
  256. honeycomb/_generated/models/ingest_key_attributes_permissions.py +74 -0
  257. honeycomb/_generated/models/ingest_key_attributes_timestamps.py +107 -0
  258. honeycomb/_generated/models/ingest_key_type.py +90 -0
  259. honeycomb/_generated/models/ingest_key_type_key_type.py +7 -0
  260. honeycomb/_generated/models/jsonapi_error_source.py +92 -0
  261. honeycomb/_generated/models/kinesis_event.py +111 -0
  262. honeycomb/_generated/models/kinesis_event_record.py +73 -0
  263. honeycomb/_generated/models/kinesis_response.py +91 -0
  264. honeycomb/_generated/models/list_api_keys_filtertype.py +8 -0
  265. honeycomb/_generated/models/map_dependency.py +118 -0
  266. honeycomb/_generated/models/map_node.py +97 -0
  267. honeycomb/_generated/models/map_node_type.py +7 -0
  268. honeycomb/_generated/models/marker.py +151 -0
  269. honeycomb/_generated/models/marker_create_request.py +78 -0
  270. honeycomb/_generated/models/marker_create_request_data.py +104 -0
  271. honeycomb/_generated/models/marker_create_request_data_attributes.py +110 -0
  272. honeycomb/_generated/models/marker_create_request_data_relationships.py +92 -0
  273. honeycomb/_generated/models/marker_create_request_data_type.py +7 -0
  274. honeycomb/_generated/models/marker_object.py +136 -0
  275. honeycomb/_generated/models/marker_object_attributes.py +146 -0
  276. honeycomb/_generated/models/marker_object_attributes_timestamps.py +107 -0
  277. honeycomb/_generated/models/marker_object_links.py +74 -0
  278. honeycomb/_generated/models/marker_object_relationships.py +111 -0
  279. honeycomb/_generated/models/marker_object_relationships_dataset.py +104 -0
  280. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +94 -0
  281. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +7 -0
  282. honeycomb/_generated/models/marker_object_type.py +7 -0
  283. honeycomb/_generated/models/marker_response.py +78 -0
  284. honeycomb/_generated/models/marker_setting.py +125 -0
  285. honeycomb/_generated/models/marker_update_request.py +78 -0
  286. honeycomb/_generated/models/marker_update_request_data.py +104 -0
  287. honeycomb/_generated/models/marker_update_request_data_attributes.py +111 -0
  288. honeycomb/_generated/models/marker_update_request_data_relationships.py +92 -0
  289. honeycomb/_generated/models/marker_update_request_data_type.py +7 -0
  290. honeycomb/_generated/models/ms_teams_recipient.py +161 -0
  291. honeycomb/_generated/models/ms_teams_recipient_details.py +80 -0
  292. honeycomb/_generated/models/ms_teams_recipient_type.py +7 -0
  293. honeycomb/_generated/models/ms_teams_workflow_recipient.py +161 -0
  294. honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +80 -0
  295. honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +7 -0
  296. honeycomb/_generated/models/notification_recipient.py +131 -0
  297. honeycomb/_generated/models/notification_recipient_details.py +117 -0
  298. honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +10 -0
  299. honeycomb/_generated/models/notification_recipient_details_variables_item.py +81 -0
  300. honeycomb/_generated/models/pager_duty_recipient.py +160 -0
  301. honeycomb/_generated/models/pager_duty_recipient_details.py +79 -0
  302. honeycomb/_generated/models/pager_duty_recipient_type.py +7 -0
  303. honeycomb/_generated/models/pagination_links.py +80 -0
  304. honeycomb/_generated/models/payload_template.py +73 -0
  305. honeycomb/_generated/models/pipeline_configuration_response.py +112 -0
  306. honeycomb/_generated/models/pipeline_configuration_response_attributes.py +101 -0
  307. honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +85 -0
  308. honeycomb/_generated/models/pipeline_configuration_response_links.py +73 -0
  309. honeycomb/_generated/models/pipeline_configuration_response_type.py +7 -0
  310. honeycomb/_generated/models/pipeline_configuration_rollout.py +112 -0
  311. honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +75 -0
  312. honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +12 -0
  313. honeycomb/_generated/models/pipeline_configuration_rollout_links.py +73 -0
  314. honeycomb/_generated/models/pipeline_configuration_rollout_type.py +7 -0
  315. honeycomb/_generated/models/preset_filter.py +78 -0
  316. honeycomb/_generated/models/query.py +346 -0
  317. honeycomb/_generated/models/query_annotation.py +166 -0
  318. honeycomb/_generated/models/query_annotation_source.py +8 -0
  319. honeycomb/_generated/models/query_calculated_fields_item.py +80 -0
  320. honeycomb/_generated/models/query_calculations_item.py +98 -0
  321. honeycomb/_generated/models/query_compare_time_offset_seconds.py +14 -0
  322. honeycomb/_generated/models/query_filter_combination.py +8 -0
  323. honeycomb/_generated/models/query_filters_item.py +126 -0
  324. honeycomb/_generated/models/query_havings_item.py +128 -0
  325. honeycomb/_generated/models/query_op.py +30 -0
  326. honeycomb/_generated/models/query_orders_item.py +115 -0
  327. honeycomb/_generated/models/query_orders_item_order.py +8 -0
  328. honeycomb/_generated/models/query_panel.py +114 -0
  329. honeycomb/_generated/models/query_panel_query_panel.py +143 -0
  330. honeycomb/_generated/models/query_panel_query_panel_query_style.py +9 -0
  331. honeycomb/_generated/models/query_result.py +130 -0
  332. honeycomb/_generated/models/query_result_details.py +156 -0
  333. honeycomb/_generated/models/query_result_details_data.py +188 -0
  334. honeycomb/_generated/models/query_result_details_links.py +85 -0
  335. honeycomb/_generated/models/query_result_links.py +85 -0
  336. honeycomb/_generated/models/query_results_data.py +89 -0
  337. honeycomb/_generated/models/query_results_data_data.py +71 -0
  338. honeycomb/_generated/models/query_results_series.py +97 -0
  339. honeycomb/_generated/models/recipient_properties.py +137 -0
  340. honeycomb/_generated/models/recipient_type.py +12 -0
  341. honeycomb/_generated/models/slack_recipient.py +160 -0
  342. honeycomb/_generated/models/slack_recipient_details.py +71 -0
  343. honeycomb/_generated/models/slack_recipient_type.py +7 -0
  344. honeycomb/_generated/models/slo.py +245 -0
  345. honeycomb/_generated/models/slo_create.py +245 -0
  346. honeycomb/_generated/models/slo_create_sli.py +75 -0
  347. honeycomb/_generated/models/slo_detailed_response.py +312 -0
  348. honeycomb/_generated/models/slo_detailed_response_status.py +10 -0
  349. honeycomb/_generated/models/slo_history.py +94 -0
  350. honeycomb/_generated/models/slo_history_request.py +93 -0
  351. honeycomb/_generated/models/slo_history_response.py +91 -0
  352. honeycomb/_generated/models/slo_panel.py +114 -0
  353. honeycomb/_generated/models/slo_panel_slo_panel.py +75 -0
  354. honeycomb/_generated/models/slo_sli.py +74 -0
  355. honeycomb/_generated/models/tag.py +79 -0
  356. honeycomb/_generated/models/team_relationship.py +78 -0
  357. honeycomb/_generated/models/team_relationship_team.py +78 -0
  358. honeycomb/_generated/models/team_relationship_team_data.py +82 -0
  359. honeycomb/_generated/models/team_relationship_team_data_type.py +7 -0
  360. honeycomb/_generated/models/template_variable_definition.py +81 -0
  361. honeycomb/_generated/models/text_panel.py +114 -0
  362. honeycomb/_generated/models/text_panel_text_panel.py +71 -0
  363. honeycomb/_generated/models/trigger_response.py +399 -0
  364. honeycomb/_generated/models/trigger_with_inline_query.py +390 -0
  365. honeycomb/_generated/models/trigger_with_inline_query_query.py +60 -0
  366. honeycomb/_generated/models/trigger_with_query_reference.py +376 -0
  367. honeycomb/_generated/models/update_board_view_request.py +107 -0
  368. honeycomb/_generated/models/update_environment_request.py +78 -0
  369. honeycomb/_generated/models/update_environment_request_data.py +98 -0
  370. honeycomb/_generated/models/update_environment_request_data_attributes.py +118 -0
  371. honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +73 -0
  372. honeycomb/_generated/models/update_environment_request_data_type.py +7 -0
  373. honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +202 -0
  374. honeycomb/_generated/models/update_pipeline_configuration_rollout.py +98 -0
  375. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +75 -0
  376. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +12 -0
  377. honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +78 -0
  378. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +98 -0
  379. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +75 -0
  380. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +12 -0
  381. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +7 -0
  382. honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +78 -0
  383. honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +7 -0
  384. honeycomb/_generated/models/user_relationship.py +78 -0
  385. honeycomb/_generated/models/user_relationship_data.py +82 -0
  386. honeycomb/_generated/models/user_relationship_data_type.py +7 -0
  387. honeycomb/_generated/models/validation_error.py +145 -0
  388. honeycomb/_generated/models/validation_error_type_detail_item.py +103 -0
  389. honeycomb/_generated/models/validation_error_type_detail_item_code.py +10 -0
  390. honeycomb/_generated/models/webhook_header.py +81 -0
  391. honeycomb/_generated/models/webhook_recipient.py +160 -0
  392. honeycomb/_generated/models/webhook_recipient_details.py +142 -0
  393. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +117 -0
  394. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +126 -0
  395. honeycomb/_generated/models/webhook_recipient_type.py +7 -0
  396. honeycomb/_generated/py.typed +1 -0
  397. honeycomb/_generated/types.py +46 -0
  398. honeycomb/auth.py +152 -0
  399. honeycomb/client.py +736 -0
  400. honeycomb/exceptions.py +236 -0
  401. honeycomb/models/__init__.py +157 -0
  402. honeycomb/models/api_keys.py +81 -0
  403. honeycomb/models/board_builder.py +387 -0
  404. honeycomb/models/boards.py +86 -0
  405. honeycomb/models/burn_alerts.py +124 -0
  406. honeycomb/models/columns.py +59 -0
  407. honeycomb/models/datasets.py +51 -0
  408. honeycomb/models/derived_columns.py +107 -0
  409. honeycomb/models/environments.py +106 -0
  410. honeycomb/models/events.py +35 -0
  411. honeycomb/models/marker_builder.py +136 -0
  412. honeycomb/models/markers.py +73 -0
  413. honeycomb/models/queries.py +210 -0
  414. honeycomb/models/query_annotations.py +63 -0
  415. honeycomb/models/query_builder.py +840 -0
  416. honeycomb/models/recipient_builder.py +248 -0
  417. honeycomb/models/recipients.py +43 -0
  418. honeycomb/models/service_map_dependencies.py +126 -0
  419. honeycomb/models/slo_builder.py +463 -0
  420. honeycomb/models/slos.py +66 -0
  421. honeycomb/models/tags_mixin.py +79 -0
  422. honeycomb/models/trigger_builder.py +561 -0
  423. honeycomb/models/triggers.py +208 -0
  424. honeycomb/resources/__init__.py +35 -0
  425. honeycomb/resources/_recipient_utils.py +156 -0
  426. honeycomb/resources/api_keys.py +303 -0
  427. honeycomb/resources/base.py +142 -0
  428. honeycomb/resources/boards.py +350 -0
  429. honeycomb/resources/burn_alerts.py +205 -0
  430. honeycomb/resources/columns.py +185 -0
  431. honeycomb/resources/datasets.py +163 -0
  432. honeycomb/resources/derived_columns.py +233 -0
  433. honeycomb/resources/environments.py +295 -0
  434. honeycomb/resources/events.py +156 -0
  435. honeycomb/resources/markers.py +334 -0
  436. honeycomb/resources/queries.py +256 -0
  437. honeycomb/resources/query_annotations.py +207 -0
  438. honeycomb/resources/query_results.py +886 -0
  439. honeycomb/resources/recipients.py +202 -0
  440. honeycomb/resources/service_map_dependencies.py +389 -0
  441. honeycomb/resources/slos.py +353 -0
  442. honeycomb/resources/triggers.py +284 -0
  443. honeycomb/tools/__init__.py +85 -0
  444. honeycomb/tools/__main__.py +204 -0
  445. honeycomb/tools/builders.py +512 -0
  446. honeycomb/tools/descriptions.py +523 -0
  447. honeycomb/tools/executor.py +860 -0
  448. honeycomb/tools/generator.py +2386 -0
  449. honeycomb/tools/schemas.py +184 -0
  450. honeycomb_api-0.1.0.dist-info/METADATA +451 -0
  451. honeycomb_api-0.1.0.dist-info/RECORD +453 -0
  452. honeycomb_api-0.1.0.dist-info/WHEEL +4 -0
  453. honeycomb_api-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,561 @@
1
+ """Builder pattern for Honeycomb Triggers with integrated query building."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import TYPE_CHECKING, Any, Literal
7
+
8
+ from typing_extensions import Self
9
+
10
+ from .query_builder import QueryBuilder
11
+ from .recipient_builder import RecipientMixin
12
+ from .tags_mixin import TagsMixin
13
+ from .triggers import (
14
+ TriggerAlertType,
15
+ TriggerCreate,
16
+ TriggerQuery,
17
+ TriggerThreshold,
18
+ TriggerThresholdOp,
19
+ )
20
+
21
+ if TYPE_CHECKING:
22
+ pass
23
+
24
+
25
+ @dataclass
26
+ class TriggerBundle:
27
+ """Bundle for trigger creation with inline recipients.
28
+
29
+ Orchestrates:
30
+ 1. Create inline recipients via Recipients API
31
+ 2. Create trigger with recipient IDs
32
+
33
+ Attributes:
34
+ dataset: Dataset slug or "__all__" for environment-wide
35
+ trigger: The TriggerCreate object
36
+ inline_recipients: Recipients without 'id' field (need creation)
37
+ """
38
+
39
+ dataset: str
40
+ trigger: TriggerCreate
41
+ inline_recipients: list[dict[str, Any]]
42
+
43
+
44
+ class TriggerBuilder(QueryBuilder, RecipientMixin, TagsMixin):
45
+ """Fluent builder for triggers with integrated query building.
46
+
47
+ Extends QueryBuilder with trigger-specific constraints:
48
+ - Only one calculation allowed
49
+ - Time range limited to 3600 seconds (1 hour)
50
+ - No absolute time ranges (start_time/end_time)
51
+ - Dataset is optional (can be dataset-scoped or environment-wide)
52
+
53
+ Example - Dataset-scoped trigger:
54
+ >>> trigger = (
55
+ ... TriggerBuilder("High Error Rate")
56
+ ... .dataset("api-logs")
57
+ ... .last_30_minutes()
58
+ ... .count()
59
+ ... .gte("status", 500)
60
+ ... .threshold_gt(100)
61
+ ... .every_5_minutes()
62
+ ... .email("oncall@example.com")
63
+ ... .slack("#alerts")
64
+ ... .build()
65
+ ... )
66
+ >>> await client.triggers.create_async(trigger.get_dataset(), trigger)
67
+
68
+ Example - Environment-wide trigger:
69
+ >>> trigger = (
70
+ ... TriggerBuilder("Global Error Spike")
71
+ ... .environment_wide()
72
+ ... .last_10_minutes()
73
+ ... .count()
74
+ ... .eq("level", "error")
75
+ ... .threshold_gt(1000)
76
+ ... .every_minute()
77
+ ... .pagerduty("routing-key-123", severity="critical")
78
+ ... .build()
79
+ ... )
80
+ >>> await client.triggers.create_environment_wide_async(trigger)
81
+ """
82
+
83
+ def __init__(self, name: str):
84
+ """Initialize TriggerBuilder with a name.
85
+
86
+ Args:
87
+ name: Human-readable name for the trigger.
88
+ """
89
+ QueryBuilder.__init__(self)
90
+ RecipientMixin.__init__(self)
91
+ TagsMixin.__init__(self)
92
+ self._name = name
93
+ self._description: str | None = None
94
+ self._dataset: str | None = None # None = environment-wide
95
+ self._threshold_op: TriggerThresholdOp | None = None
96
+ self._threshold_value: float | None = None
97
+ self._exceeded_limit: int | None = None
98
+ self._frequency: int = 900 # Default 15 minutes
99
+ self._alert_type: TriggerAlertType = TriggerAlertType.ON_CHANGE
100
+ self._disabled: bool = False
101
+ self._baseline_details: dict[str, int | str] | None = None
102
+
103
+ # -------------------------------------------------------------------------
104
+ # Scope
105
+ # -------------------------------------------------------------------------
106
+
107
+ def description(self, desc: str) -> Self:
108
+ """Set trigger description.
109
+
110
+ Args:
111
+ desc: Longer description for the trigger.
112
+
113
+ Returns:
114
+ Self for method chaining.
115
+ """
116
+ self._description = desc
117
+ return self
118
+
119
+ def dataset(self, dataset_slug: str) -> Self:
120
+ """Scope trigger to a specific dataset.
121
+
122
+ If not called, trigger will be environment-wide.
123
+
124
+ Args:
125
+ dataset_slug: Dataset slug to scope trigger to.
126
+
127
+ Returns:
128
+ Self for method chaining.
129
+ """
130
+ self._dataset = dataset_slug
131
+ return self
132
+
133
+ def environment_wide(self) -> Self:
134
+ """Explicitly mark trigger as environment-wide (no dataset).
135
+
136
+ Returns:
137
+ Self for method chaining.
138
+ """
139
+ self._dataset = None
140
+ return self
141
+
142
+ # -------------------------------------------------------------------------
143
+ # Threshold shortcuts
144
+ # -------------------------------------------------------------------------
145
+
146
+ def threshold_gt(self, value: float) -> Self:
147
+ """Trigger when value > threshold.
148
+
149
+ Args:
150
+ value: Threshold value.
151
+
152
+ Returns:
153
+ Self for method chaining.
154
+ """
155
+ self._threshold_op = TriggerThresholdOp.GREATER_THAN
156
+ self._threshold_value = value
157
+ return self
158
+
159
+ def threshold_gte(self, value: float) -> Self:
160
+ """Trigger when value >= threshold.
161
+
162
+ Args:
163
+ value: Threshold value.
164
+
165
+ Returns:
166
+ Self for method chaining.
167
+ """
168
+ self._threshold_op = TriggerThresholdOp.GREATER_THAN_OR_EQUAL
169
+ self._threshold_value = value
170
+ return self
171
+
172
+ def threshold_lt(self, value: float) -> Self:
173
+ """Trigger when value < threshold.
174
+
175
+ Args:
176
+ value: Threshold value.
177
+
178
+ Returns:
179
+ Self for method chaining.
180
+ """
181
+ self._threshold_op = TriggerThresholdOp.LESS_THAN
182
+ self._threshold_value = value
183
+ return self
184
+
185
+ def threshold_lte(self, value: float) -> Self:
186
+ """Trigger when value <= threshold.
187
+
188
+ Args:
189
+ value: Threshold value.
190
+
191
+ Returns:
192
+ Self for method chaining.
193
+ """
194
+ self._threshold_op = TriggerThresholdOp.LESS_THAN_OR_EQUAL
195
+ self._threshold_value = value
196
+ return self
197
+
198
+ def exceeded_limit(self, times: int) -> Self:
199
+ """Require threshold to be exceeded N times before alerting.
200
+
201
+ Args:
202
+ times: Number of times threshold must be exceeded (1-5).
203
+
204
+ Returns:
205
+ Self for method chaining.
206
+
207
+ Raises:
208
+ ValueError: If times is not between 1 and 5.
209
+ """
210
+ if not 1 <= times <= 5:
211
+ raise ValueError("exceeded_limit must be between 1 and 5")
212
+ self._exceeded_limit = times
213
+ return self
214
+
215
+ # -------------------------------------------------------------------------
216
+ # Frequency presets
217
+ # -------------------------------------------------------------------------
218
+
219
+ def every_minute(self) -> Self:
220
+ """Check trigger every minute (60 seconds).
221
+
222
+ Returns:
223
+ Self for method chaining.
224
+ """
225
+ self._frequency = 60
226
+ return self
227
+
228
+ def every_5_minutes(self) -> Self:
229
+ """Check trigger every 5 minutes (300 seconds).
230
+
231
+ Returns:
232
+ Self for method chaining.
233
+ """
234
+ self._frequency = 300
235
+ return self
236
+
237
+ def every_15_minutes(self) -> Self:
238
+ """Check trigger every 15 minutes (900 seconds) - default.
239
+
240
+ Returns:
241
+ Self for method chaining.
242
+ """
243
+ self._frequency = 900
244
+ return self
245
+
246
+ def every_30_minutes(self) -> Self:
247
+ """Check trigger every 30 minutes (1800 seconds).
248
+
249
+ Returns:
250
+ Self for method chaining.
251
+ """
252
+ self._frequency = 1800
253
+ return self
254
+
255
+ def every_hour(self) -> Self:
256
+ """Check trigger every hour (3600 seconds).
257
+
258
+ Returns:
259
+ Self for method chaining.
260
+ """
261
+ self._frequency = 3600
262
+ return self
263
+
264
+ def frequency(self, seconds: int) -> Self:
265
+ """Set custom frequency in seconds (60-86400).
266
+
267
+ Args:
268
+ seconds: Check frequency in seconds (60-86400).
269
+
270
+ Returns:
271
+ Self for method chaining.
272
+
273
+ Raises:
274
+ ValueError: If frequency is outside valid range.
275
+ """
276
+ if not 60 <= seconds <= 86400:
277
+ raise ValueError("Frequency must be between 60 and 86400 seconds")
278
+ self._frequency = seconds
279
+ return self
280
+
281
+ # -------------------------------------------------------------------------
282
+ # Alert behavior
283
+ # -------------------------------------------------------------------------
284
+
285
+ def alert_on_change(self) -> Self:
286
+ """Alert only when state changes (default).
287
+
288
+ Returns:
289
+ Self for method chaining.
290
+ """
291
+ self._alert_type = TriggerAlertType.ON_CHANGE
292
+ return self
293
+
294
+ def alert_on_true(self) -> Self:
295
+ """Alert every time threshold is exceeded.
296
+
297
+ Returns:
298
+ Self for method chaining.
299
+ """
300
+ self._alert_type = TriggerAlertType.ON_TRUE
301
+ return self
302
+
303
+ def disabled(self, is_disabled: bool = True) -> Self:
304
+ """Create trigger in disabled state.
305
+
306
+ Args:
307
+ is_disabled: Whether trigger should be disabled.
308
+
309
+ Returns:
310
+ Self for method chaining.
311
+ """
312
+ self._disabled = is_disabled
313
+ return self
314
+
315
+ # -------------------------------------------------------------------------
316
+ # Baseline thresholds
317
+ # -------------------------------------------------------------------------
318
+
319
+ def baseline_1_hour_ago(
320
+ self, comparison_type: Literal["percentage", "value"] = "percentage"
321
+ ) -> Self:
322
+ """Compare against results from 1 hour ago.
323
+
324
+ Args:
325
+ comparison_type: "percentage" for (current-baseline)/baseline,
326
+ "value" for current-baseline
327
+
328
+ Returns:
329
+ Self for method chaining.
330
+ """
331
+ self._baseline_details = {"offset_minutes": 60, "type": comparison_type}
332
+ return self
333
+
334
+ def baseline_1_day_ago(
335
+ self, comparison_type: Literal["percentage", "value"] = "percentage"
336
+ ) -> Self:
337
+ """Compare against results from 1 day ago.
338
+
339
+ Args:
340
+ comparison_type: "percentage" or "value"
341
+
342
+ Returns:
343
+ Self for method chaining.
344
+ """
345
+ self._baseline_details = {"offset_minutes": 1440, "type": comparison_type}
346
+ return self
347
+
348
+ def baseline_1_week_ago(
349
+ self, comparison_type: Literal["percentage", "value"] = "percentage"
350
+ ) -> Self:
351
+ """Compare against results from 1 week ago.
352
+
353
+ Args:
354
+ comparison_type: "percentage" or "value"
355
+
356
+ Returns:
357
+ Self for method chaining.
358
+ """
359
+ self._baseline_details = {"offset_minutes": 10080, "type": comparison_type}
360
+ return self
361
+
362
+ def baseline_4_weeks_ago(
363
+ self, comparison_type: Literal["percentage", "value"] = "percentage"
364
+ ) -> Self:
365
+ """Compare against results from 4 weeks ago.
366
+
367
+ Args:
368
+ comparison_type: "percentage" or "value"
369
+
370
+ Returns:
371
+ Self for method chaining.
372
+ """
373
+ self._baseline_details = {"offset_minutes": 40320, "type": comparison_type}
374
+ return self
375
+
376
+ def baseline(
377
+ self, offset_minutes: int, comparison_type: Literal["percentage", "value"]
378
+ ) -> Self:
379
+ """Set custom baseline comparison.
380
+
381
+ Args:
382
+ offset_minutes: How far back to compare. Must be one of: 60, 1440, 10080, 40320.
383
+ comparison_type: "percentage" or "value"
384
+
385
+ Returns:
386
+ Self for method chaining.
387
+
388
+ Raises:
389
+ ValueError: If offset_minutes is not a valid value.
390
+ """
391
+ valid_offsets = {60, 1440, 10080, 40320}
392
+ if offset_minutes not in valid_offsets:
393
+ raise ValueError(
394
+ f"offset_minutes must be one of {valid_offsets} (1 hour, 1 day, 7 days, or 28 days)"
395
+ )
396
+ self._baseline_details = {"offset_minutes": offset_minutes, "type": comparison_type}
397
+ return self
398
+
399
+ # -------------------------------------------------------------------------
400
+ # Build
401
+ # -------------------------------------------------------------------------
402
+
403
+ def _validate_and_get_components(
404
+ self,
405
+ ) -> tuple[
406
+ TriggerThreshold,
407
+ TriggerQuery,
408
+ list[dict[str, Any]] | None,
409
+ list[dict[str, str]] | None,
410
+ dict[str, int | str] | None,
411
+ ]:
412
+ """Validate trigger configuration and return components.
413
+
414
+ Returns:
415
+ Tuple of (threshold, query, recipients, tags, baseline_details)
416
+
417
+ Raises:
418
+ ValueError: If constraints are violated
419
+ """
420
+ # Validate single calculation
421
+ if len(self._calculations) > 1:
422
+ raise ValueError(
423
+ f"Triggers can only have one calculation, got {len(self._calculations)}. "
424
+ "Use multiple triggers for multiple calculations."
425
+ )
426
+
427
+ # Validate no absolute time
428
+ if self._start_time is not None or self._end_time is not None:
429
+ raise ValueError(
430
+ "Triggers do not support absolute time ranges. "
431
+ "Use time_range() or time presets like last_30_minutes()."
432
+ )
433
+
434
+ # Validate time range
435
+ time_range = self._time_range or 3600 # Default 1 hour
436
+ if time_range > 3600:
437
+ raise ValueError(
438
+ f"Trigger time range must be <= 3600 seconds (1 hour), got {time_range}. "
439
+ "Use a shorter time preset like last_30_minutes()."
440
+ )
441
+
442
+ # Validate frequency vs duration constraint
443
+ # API rule: duration <= frequency * 4
444
+ if time_range > self._frequency * 4:
445
+ raise ValueError(
446
+ f"Time range ({time_range}s) cannot be more than 4x frequency ({self._frequency}s). "
447
+ f"Maximum time range for this frequency: {self._frequency * 4}s. "
448
+ f"Either increase frequency or decrease time range."
449
+ )
450
+
451
+ # Validate threshold
452
+ if self._threshold_op is None or self._threshold_value is None:
453
+ raise ValueError(
454
+ "Threshold is required. Use threshold_gt(), threshold_gte(), "
455
+ "threshold_lt(), or threshold_lte()."
456
+ )
457
+
458
+ # Build threshold
459
+ threshold = TriggerThreshold(
460
+ op=self._threshold_op,
461
+ value=self._threshold_value,
462
+ exceeded_limit=self._exceeded_limit,
463
+ )
464
+
465
+ # Build query
466
+ query = TriggerQuery(
467
+ time_range=time_range,
468
+ granularity=self._granularity,
469
+ calculations=self._calculations if self._calculations else None,
470
+ filters=self._filters if self._filters else None,
471
+ breakdowns=self._breakdowns if self._breakdowns else None,
472
+ filter_combination=self._filter_combination,
473
+ )
474
+
475
+ # Get recipients, tags, baseline if any
476
+ recipients = self._get_all_recipients() if self._get_all_recipients() else None
477
+ tags = self._get_all_tags()
478
+ baseline = self._baseline_details
479
+
480
+ return threshold, query, recipients, tags, baseline
481
+
482
+ def build(self) -> TriggerBundle: # type: ignore[override]
483
+ """Build TriggerBundle with validation for orchestrated creation.
484
+
485
+ Returns:
486
+ TriggerBundle containing trigger and inline recipients
487
+
488
+ Raises:
489
+ ValueError: If constraints are violated:
490
+ - More than one calculation
491
+ - Time range > 3600 seconds
492
+ - Absolute time used
493
+ - Missing threshold
494
+ - Frequency vs duration constraint (duration <= frequency * 4)
495
+ """
496
+ threshold, query, recipients, tags, baseline = self._validate_and_get_components()
497
+
498
+ # Separate inline recipients (without 'id') from those with IDs
499
+ inline_recipients: list[dict[str, Any]] = []
500
+ recipients_with_ids: list[dict[str, Any]] = []
501
+
502
+ if recipients:
503
+ for recip in recipients:
504
+ if "id" in recip:
505
+ recipients_with_ids.append(recip)
506
+ else:
507
+ inline_recipients.append(recip.copy())
508
+
509
+ # Build trigger with only the recipients that already have IDs
510
+ trigger = TriggerCreate(
511
+ name=self._name,
512
+ description=self._description,
513
+ threshold=threshold,
514
+ frequency=self._frequency,
515
+ query=query,
516
+ disabled=self._disabled,
517
+ alert_type=self._alert_type,
518
+ recipients=recipients_with_ids if recipients_with_ids else None,
519
+ tags=tags,
520
+ baseline_details=baseline,
521
+ )
522
+
523
+ return TriggerBundle(
524
+ dataset=self.get_dataset(),
525
+ trigger=trigger,
526
+ inline_recipients=inline_recipients,
527
+ )
528
+
529
+ def build_trigger(self) -> TriggerCreate:
530
+ """Build TriggerCreate with validation (legacy method).
531
+
532
+ Deprecated: Use build() which returns TriggerBundle for better orchestration.
533
+
534
+ Returns:
535
+ TriggerCreate object ready for API submission.
536
+
537
+ Raises:
538
+ ValueError: If constraints are violated (same as build())
539
+ """
540
+ threshold, query, recipients, tags, baseline = self._validate_and_get_components()
541
+
542
+ return TriggerCreate(
543
+ name=self._name,
544
+ description=self._description,
545
+ threshold=threshold,
546
+ frequency=self._frequency,
547
+ query=query,
548
+ disabled=self._disabled,
549
+ alert_type=self._alert_type,
550
+ recipients=recipients,
551
+ tags=tags,
552
+ baseline_details=baseline,
553
+ )
554
+
555
+ def get_dataset(self) -> str:
556
+ """Get the dataset this trigger is scoped to.
557
+
558
+ Returns:
559
+ Dataset slug or "__all__" for environment-wide triggers.
560
+ """
561
+ return self._dataset if self._dataset else "__all__"