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,463 @@
1
+ """SLO Builder - Fluent interface for creating SLOs with burn alerts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ from typing import TYPE_CHECKING
7
+
8
+ from honeycomb.models.burn_alerts import BurnAlertType
9
+ from honeycomb.models.recipient_builder import RecipientMixin
10
+ from honeycomb.models.slos import SLI, SLOCreate
11
+
12
+ if TYPE_CHECKING:
13
+ from honeycomb.models.derived_columns import DerivedColumnCreate
14
+
15
+
16
+ @dataclass
17
+ class SLIDefinition:
18
+ """SLI definition - either references existing DC or creates new one."""
19
+
20
+ alias: str
21
+ expression: str | None = None # None = use existing DC
22
+ description: str | None = None
23
+
24
+ def is_new_derived_column(self) -> bool:
25
+ """Check if this SLI requires creating a new derived column."""
26
+ return self.expression is not None
27
+
28
+
29
+ @dataclass
30
+ class BurnAlertDefinition:
31
+ """Burn alert definition with embedded recipients."""
32
+
33
+ alert_type: BurnAlertType
34
+ description: str | None = None
35
+ # Exhaustion time fields
36
+ exhaustion_minutes: int | None = None
37
+ # Budget rate fields
38
+ budget_rate_window_minutes: int | None = None
39
+ budget_rate_decrease_percent: float | None = None
40
+ # Recipients
41
+ recipients: list[dict] = field(default_factory=list)
42
+
43
+
44
+ @dataclass
45
+ class SLOBundle:
46
+ """Bundle containing SLO and related resources to create.
47
+
48
+ Attributes:
49
+ slo: The SLOCreate object
50
+ datasets: List of dataset slugs (single or multiple)
51
+ derived_column: DerivedColumnCreate if SLI needs new DC
52
+ derived_column_environment_wide: True if multi-dataset
53
+ burn_alerts: List of burn alert definitions
54
+ """
55
+
56
+ slo: SLOCreate
57
+ datasets: list[str]
58
+ derived_column: DerivedColumnCreate | None
59
+ derived_column_environment_wide: bool
60
+ burn_alerts: list[BurnAlertDefinition]
61
+
62
+
63
+ class BurnAlertBuilder(RecipientMixin):
64
+ """Builder for burn alerts with recipients.
65
+
66
+ Example - Exhaustion time alert:
67
+ alert = (
68
+ BurnAlertBuilder(BurnAlertType.EXHAUSTION_TIME)
69
+ .exhaustion_minutes(60)
70
+ .description("Alert when budget exhausts in 1 hour")
71
+ .email("oncall@example.com")
72
+ .slack("#alerts")
73
+ .build()
74
+ )
75
+
76
+ Example - Budget rate alert:
77
+ alert = (
78
+ BurnAlertBuilder(BurnAlertType.BUDGET_RATE)
79
+ .window_minutes(60)
80
+ .threshold_percent(1.0)
81
+ .pagerduty("routing-key", severity="critical")
82
+ .build()
83
+ )
84
+ """
85
+
86
+ def __init__(self, alert_type: BurnAlertType):
87
+ RecipientMixin.__init__(self)
88
+ self._alert_type = alert_type
89
+ self._description: str | None = None
90
+ self._exhaustion_minutes: int | None = None
91
+ self._budget_rate_window_minutes: int | None = None
92
+ self._budget_rate_decrease_percent: float | None = None
93
+
94
+ def description(self, desc: str) -> BurnAlertBuilder:
95
+ """Set burn alert description."""
96
+ self._description = desc
97
+ return self
98
+
99
+ # -------------------------------------------------------------------------
100
+ # Exhaustion time config
101
+ # -------------------------------------------------------------------------
102
+
103
+ def exhaustion_minutes(self, minutes: int) -> BurnAlertBuilder:
104
+ """Set exhaustion time threshold in minutes.
105
+
106
+ Alert triggers when error budget will be exhausted within this timeframe.
107
+
108
+ Args:
109
+ minutes: Minutes until exhaustion threshold (e.g., 60 = 1 hour)
110
+ """
111
+ self._exhaustion_minutes = minutes
112
+ return self
113
+
114
+ # -------------------------------------------------------------------------
115
+ # Budget rate config
116
+ # -------------------------------------------------------------------------
117
+
118
+ def window_minutes(self, minutes: int) -> BurnAlertBuilder:
119
+ """Set budget rate window in minutes.
120
+
121
+ Args:
122
+ minutes: Time window for budget rate calculation
123
+ """
124
+ self._budget_rate_window_minutes = minutes
125
+ return self
126
+
127
+ def threshold_percent(self, percent: float) -> BurnAlertBuilder:
128
+ """Set budget decrease threshold as percentage.
129
+
130
+ Args:
131
+ percent: Budget decrease threshold (e.g., 1.0 = 1%)
132
+ """
133
+ self._budget_rate_decrease_percent = percent
134
+ return self
135
+
136
+ # -------------------------------------------------------------------------
137
+ # Build
138
+ # -------------------------------------------------------------------------
139
+
140
+ def build(self) -> BurnAlertDefinition:
141
+ """Build BurnAlertDefinition with validation.
142
+
143
+ Returns:
144
+ BurnAlertDefinition with all configured settings
145
+
146
+ Raises:
147
+ ValueError: If required fields for alert type are missing
148
+ """
149
+ # Validate alert type specific fields
150
+ if self._alert_type == BurnAlertType.EXHAUSTION_TIME:
151
+ if self._exhaustion_minutes is None:
152
+ raise ValueError(
153
+ "exhaustion_minutes is required for EXHAUSTION_TIME alerts. "
154
+ "Use exhaustion_minutes()."
155
+ )
156
+ elif self._alert_type == BurnAlertType.BUDGET_RATE:
157
+ if self._budget_rate_window_minutes is None:
158
+ raise ValueError(
159
+ "window_minutes is required for BUDGET_RATE alerts. Use window_minutes()."
160
+ )
161
+ if self._budget_rate_decrease_percent is None:
162
+ raise ValueError(
163
+ "threshold_percent is required for BUDGET_RATE alerts. Use threshold_percent()."
164
+ )
165
+
166
+ return BurnAlertDefinition(
167
+ alert_type=self._alert_type,
168
+ description=self._description,
169
+ exhaustion_minutes=self._exhaustion_minutes,
170
+ budget_rate_window_minutes=self._budget_rate_window_minutes,
171
+ budget_rate_decrease_percent=self._budget_rate_decrease_percent,
172
+ recipients=self._get_all_recipients(),
173
+ )
174
+
175
+
176
+ class SLOBuilder:
177
+ """Fluent builder for SLOs with burn alerts and derived columns.
178
+
179
+ Example - Single dataset with existing derived column:
180
+ slo = (
181
+ SLOBuilder("API Availability")
182
+ .dataset("api-logs")
183
+ .target_percentage(99.9)
184
+ .time_period_days(30)
185
+ .sli(alias="api_success_rate")
186
+ .exhaustion_alert(
187
+ BurnAlertBuilder(BurnAlertType.EXHAUSTION_TIME)
188
+ .exhaustion_minutes(60)
189
+ .email("oncall@example.com")
190
+ )
191
+ .build()
192
+ )
193
+
194
+ Example - Multiple datasets with new derived column:
195
+ slo = (
196
+ SLOBuilder("Cross-Service Availability")
197
+ .datasets(["api-logs", "web-logs", "worker-logs"])
198
+ .target_nines(3) # 99.9%
199
+ .sli(
200
+ alias="service_success",
201
+ expression="IF(EQUALS($status, 200), 1, 0)",
202
+ description="1 for success, 0 for failure"
203
+ )
204
+ .budget_rate_alert(
205
+ BurnAlertBuilder(BurnAlertType.BUDGET_RATE)
206
+ .window_minutes(60)
207
+ .threshold_percent(1.0)
208
+ .pagerduty("routing-key", severity="critical")
209
+ )
210
+ .build()
211
+ )
212
+ """
213
+
214
+ def __init__(self, name: str):
215
+ self._name = name
216
+ self._description: str | None = None
217
+ self._datasets: list[str] = []
218
+ self._target_per_million: int | None = None
219
+ self._time_period_days: int = 30
220
+ self._sli: SLIDefinition | None = None
221
+ self._burn_alerts: list[BurnAlertDefinition] = []
222
+
223
+ # -------------------------------------------------------------------------
224
+ # Basic configuration
225
+ # -------------------------------------------------------------------------
226
+
227
+ def description(self, desc: str) -> SLOBuilder:
228
+ """Set SLO description."""
229
+ self._description = desc
230
+ return self
231
+
232
+ # -------------------------------------------------------------------------
233
+ # Dataset scope
234
+ # -------------------------------------------------------------------------
235
+
236
+ def dataset(self, dataset_slug: str) -> SLOBuilder:
237
+ """Scope SLO to a single dataset.
238
+
239
+ Args:
240
+ dataset_slug: Dataset slug
241
+ """
242
+ self._datasets = [dataset_slug]
243
+ return self
244
+
245
+ def datasets(self, dataset_slugs: list[str]) -> SLOBuilder:
246
+ """Scope SLO to multiple datasets.
247
+
248
+ Note: When using multiple datasets, any new derived column
249
+ will be created as environment-wide.
250
+
251
+ Args:
252
+ dataset_slugs: List of dataset slugs
253
+ """
254
+ self._datasets = dataset_slugs
255
+ return self
256
+
257
+ # -------------------------------------------------------------------------
258
+ # Target configuration
259
+ # -------------------------------------------------------------------------
260
+
261
+ def target_percentage(self, percent: float) -> SLOBuilder:
262
+ """Set target as percentage (e.g., 99.9 -> 999000 per million).
263
+
264
+ Args:
265
+ percent: Target percentage (e.g., 99.9)
266
+ """
267
+ self._target_per_million = int(percent * 10000)
268
+ return self
269
+
270
+ def target_nines(self, nines: int) -> SLOBuilder:
271
+ """Set target by number of nines.
272
+
273
+ Examples:
274
+ 2 nines = 99%
275
+ 3 nines = 99.9%
276
+ 4 nines = 99.99%
277
+
278
+ Args:
279
+ nines: Number of nines (1-5)
280
+ """
281
+ percentage = 100 - (100 / (10**nines))
282
+ return self.target_percentage(percentage)
283
+
284
+ def target_per_million(self, value: int) -> SLOBuilder:
285
+ """Set target directly as per-million value.
286
+
287
+ Args:
288
+ value: Target per million (e.g., 999000 = 99.9%)
289
+ """
290
+ self._target_per_million = value
291
+ return self
292
+
293
+ # -------------------------------------------------------------------------
294
+ # Time period
295
+ # -------------------------------------------------------------------------
296
+
297
+ def time_period_days(self, days: int) -> SLOBuilder:
298
+ """Set SLO time period in days (1-90).
299
+
300
+ Args:
301
+ days: Time period in days
302
+
303
+ Raises:
304
+ ValueError: If days not in range 1-90
305
+ """
306
+ if not 1 <= days <= 90:
307
+ raise ValueError("Time period must be between 1 and 90 days")
308
+ self._time_period_days = days
309
+ return self
310
+
311
+ def time_period_weeks(self, weeks: int) -> SLOBuilder:
312
+ """Set SLO time period in weeks.
313
+
314
+ Args:
315
+ weeks: Time period in weeks
316
+ """
317
+ return self.time_period_days(weeks * 7)
318
+
319
+ # -------------------------------------------------------------------------
320
+ # SLI definition
321
+ # -------------------------------------------------------------------------
322
+
323
+ def sli(
324
+ self,
325
+ alias: str,
326
+ expression: str | None = None,
327
+ description: str | None = None,
328
+ ) -> SLOBuilder:
329
+ """Define the SLI (Service Level Indicator).
330
+
331
+ Args:
332
+ alias: Name of the derived column (existing or new)
333
+ expression: If provided, creates a new derived column.
334
+ If None, uses an existing derived column.
335
+ description: Description for new derived column (ignored if using existing)
336
+
337
+ Examples:
338
+ # Use existing derived column
339
+ .sli(alias="api_success_rate")
340
+
341
+ # Create new derived column
342
+ .sli(
343
+ alias="request_success",
344
+ expression="IF(LT($status_code, 400), 1, 0)",
345
+ description="1 if request succeeded, 0 otherwise"
346
+ )
347
+ """
348
+ self._sli = SLIDefinition(
349
+ alias=alias,
350
+ expression=expression,
351
+ description=description,
352
+ )
353
+ return self
354
+
355
+ # -------------------------------------------------------------------------
356
+ # Burn alerts
357
+ # -------------------------------------------------------------------------
358
+
359
+ def exhaustion_alert(self, builder: BurnAlertBuilder) -> SLOBuilder:
360
+ """Add an exhaustion time burn alert.
361
+
362
+ Args:
363
+ builder: BurnAlertBuilder configured with EXHAUSTION_TIME type
364
+
365
+ Example:
366
+ .exhaustion_alert(
367
+ BurnAlertBuilder(BurnAlertType.EXHAUSTION_TIME)
368
+ .exhaustion_minutes(60)
369
+ .description("Alert when budget exhausts in 1 hour")
370
+ .email("oncall@example.com")
371
+ )
372
+
373
+ Raises:
374
+ ValueError: If builder is not EXHAUSTION_TIME type
375
+ """
376
+ if builder._alert_type != BurnAlertType.EXHAUSTION_TIME:
377
+ raise ValueError("exhaustion_alert() requires EXHAUSTION_TIME alert type")
378
+ self._burn_alerts.append(builder.build())
379
+ return self
380
+
381
+ def budget_rate_alert(self, builder: BurnAlertBuilder) -> SLOBuilder:
382
+ """Add a budget rate burn alert.
383
+
384
+ Args:
385
+ builder: BurnAlertBuilder configured with BUDGET_RATE type
386
+
387
+ Example:
388
+ .budget_rate_alert(
389
+ BurnAlertBuilder(BurnAlertType.BUDGET_RATE)
390
+ .window_minutes(60)
391
+ .threshold_percent(1.0)
392
+ .pagerduty("routing-key")
393
+ )
394
+
395
+ Raises:
396
+ ValueError: If builder is not BUDGET_RATE type
397
+ """
398
+ if builder._alert_type != BurnAlertType.BUDGET_RATE:
399
+ raise ValueError("budget_rate_alert() requires BUDGET_RATE alert type")
400
+ self._burn_alerts.append(builder.build())
401
+ return self
402
+
403
+ # -------------------------------------------------------------------------
404
+ # Build
405
+ # -------------------------------------------------------------------------
406
+
407
+ def build(self) -> SLOBundle:
408
+ """Build SLO bundle with validation.
409
+
410
+ Returns:
411
+ SLOBundle containing:
412
+ - slo: The SLOCreate object
413
+ - datasets: List of dataset slugs
414
+ - derived_column: DerivedColumnCreate if SLI needs new DC
415
+ - derived_column_environment_wide: True if multi-dataset
416
+ - burn_alerts: List of burn alert definitions
417
+
418
+ Raises:
419
+ ValueError: If required fields are missing
420
+ """
421
+ if not self._datasets:
422
+ raise ValueError("At least one dataset is required. Use dataset() or datasets().")
423
+
424
+ if self._target_per_million is None:
425
+ raise ValueError(
426
+ "Target is required. Use target_percentage(), "
427
+ "target_nines(), or target_per_million()."
428
+ )
429
+
430
+ if self._sli is None:
431
+ raise ValueError("SLI is required. Use sli(alias=...) to define it.")
432
+
433
+ # Determine if derived column should be environment-wide
434
+ is_multi_dataset = len(self._datasets) > 1
435
+
436
+ # Build derived column if needed
437
+ derived_column = None
438
+ if self._sli.is_new_derived_column():
439
+ # Import here to avoid circular dependency
440
+ from honeycomb.models.derived_columns import DerivedColumnCreate
441
+
442
+ derived_column = DerivedColumnCreate(
443
+ alias=self._sli.alias,
444
+ expression=self._sli.expression,
445
+ description=self._sli.description,
446
+ )
447
+
448
+ # Build SLO
449
+ slo = SLOCreate(
450
+ name=self._name,
451
+ description=self._description,
452
+ sli=SLI(alias=self._sli.alias),
453
+ time_period_days=self._time_period_days,
454
+ target_per_million=self._target_per_million,
455
+ )
456
+
457
+ return SLOBundle(
458
+ slo=slo,
459
+ datasets=self._datasets,
460
+ derived_column=derived_column,
461
+ derived_column_environment_wide=is_multi_dataset,
462
+ burn_alerts=self._burn_alerts,
463
+ )
@@ -0,0 +1,66 @@
1
+ """Pydantic models for Honeycomb SLOs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from typing import Any
7
+
8
+ from pydantic import BaseModel, Field
9
+
10
+
11
+ class SLI(BaseModel):
12
+ """Service Level Indicator configuration."""
13
+
14
+ alias: str | None = Field(default=None, description="Alias for the SLI")
15
+
16
+
17
+ class SLOCreate(BaseModel):
18
+ """Model for creating a new SLO."""
19
+
20
+ name: str = Field(description="Human-readable name for the SLO")
21
+ description: str | None = Field(default=None, description="Longer description")
22
+ sli: SLI = Field(description="SLI configuration")
23
+ time_period_days: int = Field(
24
+ default=30,
25
+ ge=1,
26
+ le=90,
27
+ description="Time period for the SLO in days (1-90)",
28
+ )
29
+ target_per_million: int = Field(
30
+ ge=0,
31
+ le=1000000,
32
+ description="Target success rate per million (e.g., 999000 = 99.9%)",
33
+ )
34
+
35
+ def model_dump_for_api(self) -> dict[str, Any]:
36
+ """Serialize for API request."""
37
+ data: dict[str, Any] = {
38
+ "name": self.name,
39
+ "sli": {},
40
+ "time_period_days": self.time_period_days,
41
+ "target_per_million": self.target_per_million,
42
+ }
43
+
44
+ if self.description:
45
+ data["description"] = self.description
46
+
47
+ if self.sli.alias:
48
+ data["sli"]["alias"] = self.sli.alias
49
+
50
+ return data
51
+
52
+
53
+ class SLO(BaseModel):
54
+ """A Honeycomb SLO (response model)."""
55
+
56
+ id: str = Field(description="Unique identifier")
57
+ name: str = Field(description="Human-readable name")
58
+ description: str | None = Field(default=None, description="Longer description")
59
+ sli: dict = Field(description="SLI configuration")
60
+ time_period_days: int = Field(description="Time period in days")
61
+ target_per_million: int = Field(description="Target per million")
62
+ dataset_slugs: list[str] | None = Field(default=None, description="Datasets this SLO spans")
63
+ created_at: datetime | None = Field(default=None, description="Creation timestamp")
64
+ updated_at: datetime | None = Field(default=None, description="Last update timestamp")
65
+
66
+ model_config = {"extra": "allow"}
@@ -0,0 +1,79 @@
1
+ """Mixin for adding tags to Honeycomb resources."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Self
6
+
7
+
8
+ class TagsMixin:
9
+ """Mixin providing tag management methods.
10
+
11
+ Tags are key-value pairs used to identify and organize resources.
12
+ Supported by: Triggers, Boards, SLOs.
13
+ """
14
+
15
+ def __init__(self) -> None:
16
+ """Initialize tag storage."""
17
+ self._tags: list[dict[str, str]] = []
18
+
19
+ def tag(self, key: str, value: str) -> Self:
20
+ """Add a tag to the resource.
21
+
22
+ Args:
23
+ key: Tag key (lowercase letters and underscores only, max 32 chars).
24
+ value: Tag value (must start with lowercase letter,
25
+ alphanumeric + / and -, max 128 chars).
26
+
27
+ Returns:
28
+ Self for method chaining.
29
+
30
+ Raises:
31
+ ValueError: If key or value format is invalid.
32
+ """
33
+ # Validate key
34
+ if not key or len(key) > 32:
35
+ raise ValueError("Tag key must be 1-32 characters")
36
+ if not all(c.islower() or c == "_" for c in key):
37
+ raise ValueError("Tag key must contain only lowercase letters and underscores")
38
+
39
+ # Validate value
40
+ if not value or len(value) > 128:
41
+ raise ValueError("Tag value must be 1-128 characters")
42
+ if not value[0].islower():
43
+ raise ValueError("Tag value must start with a lowercase letter")
44
+
45
+ # Allow lowercase letters, numbers, /, and -
46
+ allowed_chars = set("abcdefghijklmnopqrstuvwxyz0123456789/-")
47
+ if not all(c in allowed_chars for c in value):
48
+ raise ValueError("Tag value can only contain lowercase letters, numbers, / and -")
49
+
50
+ # Check max tags limit (10)
51
+ if len(self._tags) >= 10:
52
+ raise ValueError("Maximum of 10 tags allowed")
53
+
54
+ self._tags.append({"key": key, "value": value})
55
+ return self
56
+
57
+ def tags(self, tags: dict[str, str]) -> Self:
58
+ """Add multiple tags from a dictionary.
59
+
60
+ Args:
61
+ tags: Dictionary of key-value pairs.
62
+
63
+ Returns:
64
+ Self for method chaining.
65
+
66
+ Raises:
67
+ ValueError: If any key or value format is invalid.
68
+ """
69
+ for key, value in tags.items():
70
+ self.tag(key, value)
71
+ return self
72
+
73
+ def _get_all_tags(self) -> list[dict[str, str]] | None:
74
+ """Get tags for API (None if empty).
75
+
76
+ Returns:
77
+ List of tag dictionaries or None if no tags.
78
+ """
79
+ return self._tags if self._tags else None