honeycomb-api 0.1.0__py3-none-any.whl → 0.5.3__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 (443) hide show
  1. honeycomb/__init__.py +9 -0
  2. honeycomb/_generated/api/auth/get_auth.py +2 -5
  3. honeycomb/_generated/api/auth/get_v2_auth.py +2 -5
  4. honeycomb/_generated/api/boards/create_board.py +6 -5
  5. honeycomb/_generated/api/boards/create_board_view.py +14 -9
  6. honeycomb/_generated/api/boards/delete_board.py +2 -5
  7. honeycomb/_generated/api/boards/delete_board_view.py +2 -5
  8. honeycomb/_generated/api/boards/get_board.py +2 -5
  9. honeycomb/_generated/api/boards/get_board_view.py +2 -5
  10. honeycomb/_generated/api/boards/list_board_views.py +10 -9
  11. honeycomb/_generated/api/boards/list_boards.py +2 -5
  12. honeycomb/_generated/api/boards/update_board.py +10 -5
  13. honeycomb/_generated/api/boards/update_board_view.py +2 -5
  14. honeycomb/_generated/api/burn_alerts/create_burn_alert.py +6 -8
  15. honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +2 -5
  16. honeycomb/_generated/api/burn_alerts/get_burn_alert.py +2 -5
  17. honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +2 -5
  18. honeycomb/_generated/api/calculated_fields/create_calculated_field.py +2 -5
  19. honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +2 -5
  20. honeycomb/_generated/api/calculated_fields/get_calculated_field.py +2 -5
  21. honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +2 -8
  22. honeycomb/_generated/api/calculated_fields/update_calculated_field.py +2 -5
  23. honeycomb/_generated/api/columns/create_column.py +2 -5
  24. honeycomb/_generated/api/columns/delete_column.py +2 -5
  25. honeycomb/_generated/api/columns/get_column.py +2 -5
  26. honeycomb/_generated/api/columns/list_columns.py +2 -8
  27. honeycomb/_generated/api/columns/update_column.py +2 -5
  28. honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +2 -5
  29. honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +2 -5
  30. honeycomb/_generated/api/datasets/create_dataset.py +2 -5
  31. honeycomb/_generated/api/datasets/delete_dataset.py +2 -5
  32. honeycomb/_generated/api/datasets/get_dataset.py +2 -5
  33. honeycomb/_generated/api/datasets/list_datasets.py +2 -5
  34. honeycomb/_generated/api/datasets/update_dataset.py +2 -5
  35. honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +4 -6
  36. honeycomb/_generated/api/environments/create_environment.py +2 -5
  37. honeycomb/_generated/api/environments/delete_environment.py +2 -5
  38. honeycomb/_generated/api/environments/get_environment.py +2 -5
  39. honeycomb/_generated/api/environments/list_environments.py +2 -7
  40. honeycomb/_generated/api/environments/update_environment.py +2 -5
  41. honeycomb/_generated/api/events/create_event.py +2 -7
  42. honeycomb/_generated/api/events/create_events.py +7 -11
  43. honeycomb/_generated/api/key_management/create_api_key.py +2 -5
  44. honeycomb/_generated/api/key_management/delete_api_key.py +2 -5
  45. honeycomb/_generated/api/key_management/get_api_key.py +2 -5
  46. honeycomb/_generated/api/key_management/list_api_keys.py +2 -7
  47. honeycomb/_generated/api/key_management/update_api_key.py +2 -5
  48. honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +2 -5
  49. honeycomb/_generated/api/marker_settings/create_marker_setting.py +2 -5
  50. honeycomb/_generated/api/marker_settings/delete_marker_settings.py +2 -5
  51. honeycomb/_generated/api/marker_settings/list_marker_settings.py +2 -5
  52. honeycomb/_generated/api/marker_settings/update_marker_settings.py +2 -5
  53. honeycomb/_generated/api/markers/create_marker.py +2 -5
  54. honeycomb/_generated/api/markers/create_marker_v2.py +2 -5
  55. honeycomb/_generated/api/markers/delete_marker.py +2 -5
  56. honeycomb/_generated/api/markers/get_marker.py +2 -5
  57. honeycomb/_generated/api/markers/update_marker.py +2 -5
  58. honeycomb/_generated/api/markers/update_marker_v2.py +2 -5
  59. honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +4 -8
  60. honeycomb/_generated/api/pipelines/record_pipeline_usage.py +4 -6
  61. honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +6 -7
  62. honeycomb/_generated/api/queries/create_query.py +2 -5
  63. honeycomb/_generated/api/queries/get_query.py +2 -5
  64. honeycomb/_generated/api/query_annotations/create_query_annotation.py +2 -5
  65. honeycomb/_generated/api/query_annotations/delete_query_annotation.py +2 -5
  66. honeycomb/_generated/api/query_annotations/get_query_annotation.py +2 -5
  67. honeycomb/_generated/api/query_annotations/list_query_annotations.py +2 -7
  68. honeycomb/_generated/api/query_annotations/update_query_annotation.py +2 -5
  69. honeycomb/_generated/api/query_data/create_query_result.py +2 -5
  70. honeycomb/_generated/api/query_data/get_query_result.py +2 -5
  71. honeycomb/_generated/api/recipients/create_recipient.py +2 -6
  72. honeycomb/_generated/api/recipients/delete_recipient.py +2 -5
  73. honeycomb/_generated/api/recipients/get_recipient.py +2 -6
  74. honeycomb/_generated/api/recipients/list_recipients.py +2 -6
  75. honeycomb/_generated/api/recipients/update_recipient.py +2 -6
  76. honeycomb/_generated/api/reporting/get_slo_history.py +2 -5
  77. honeycomb/_generated/api/service_maps/create_map_dependency_request.py +6 -9
  78. honeycomb/_generated/api/service_maps/get_map_dependencies.py +2 -7
  79. honeycomb/_generated/api/sl_os/create_slo.py +2 -5
  80. honeycomb/_generated/api/sl_os/delete_slo.py +2 -5
  81. honeycomb/_generated/api/sl_os/get_slo.py +2 -8
  82. honeycomb/_generated/api/sl_os/list_slos.py +2 -5
  83. honeycomb/_generated/api/sl_os/update_slo.py +2 -5
  84. honeycomb/_generated/api/triggers/create_trigger.py +2 -6
  85. honeycomb/_generated/api/triggers/delete_trigger.py +2 -5
  86. honeycomb/_generated/api/triggers/get_trigger.py +2 -5
  87. honeycomb/_generated/api/triggers/list_triggers.py +2 -5
  88. honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +2 -5
  89. honeycomb/_generated/api/triggers/update_trigger.py +2 -5
  90. honeycomb/_generated/client.py +2 -5
  91. honeycomb/_generated/models/__init__.py +195 -88
  92. honeycomb/_generated/models/api_key_create_request.py +6 -5
  93. honeycomb/_generated/models/api_key_create_request_data.py +15 -11
  94. honeycomb/_generated/models/api_key_create_request_data_relationships.py +2 -3
  95. honeycomb/_generated/models/api_key_create_request_data_type.py +1 -0
  96. honeycomb/_generated/models/api_key_list_response.py +2 -5
  97. honeycomb/_generated/models/api_key_object.py +14 -14
  98. honeycomb/_generated/models/api_key_object_links.py +2 -9
  99. honeycomb/_generated/models/api_key_object_relationships.py +5 -9
  100. honeycomb/_generated/models/api_key_object_type.py +1 -0
  101. honeycomb/_generated/models/api_key_response.py +2 -3
  102. honeycomb/_generated/models/api_key_update_request.py +15 -17
  103. honeycomb/_generated/models/auth.py +2 -5
  104. honeycomb/_generated/models/auth_api_key_access.py +2 -9
  105. honeycomb/_generated/models/auth_environment.py +2 -9
  106. honeycomb/_generated/models/auth_team.py +2 -9
  107. honeycomb/_generated/models/auth_type.py +1 -0
  108. honeycomb/_generated/models/auth_v2_response.py +5 -8
  109. honeycomb/_generated/models/auth_v2_response_data.py +14 -11
  110. honeycomb/_generated/models/auth_v2_response_data_attributes.py +10 -9
  111. honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +1 -0
  112. honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +4 -12
  113. honeycomb/_generated/models/auth_v2_response_data_relationships.py +1 -7
  114. honeycomb/_generated/models/auth_v2_response_data_type.py +1 -0
  115. honeycomb/_generated/models/base_trigger.py +21 -18
  116. honeycomb/_generated/models/base_trigger_alert_type.py +1 -0
  117. honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +5 -9
  118. honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +1 -0
  119. honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +1 -0
  120. honeycomb/_generated/models/base_trigger_evaluation_schedule.py +8 -6
  121. honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +1 -0
  122. honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +4 -9
  123. honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +1 -0
  124. honeycomb/_generated/models/base_trigger_threshold.py +2 -9
  125. honeycomb/_generated/models/base_trigger_threshold_op.py +1 -0
  126. honeycomb/_generated/models/batch_event.py +2 -5
  127. honeycomb/_generated/models/board.py +15 -17
  128. honeycomb/_generated/models/board_layout_generation.py +1 -0
  129. honeycomb/_generated/models/board_links.py +2 -9
  130. honeycomb/_generated/models/board_panel_position.py +2 -9
  131. honeycomb/_generated/models/board_query_visualization_settings.py +8 -8
  132. honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +4 -10
  133. honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +1 -0
  134. honeycomb/_generated/models/board_type.py +1 -0
  135. honeycomb/_generated/models/board_view_filter.py +2 -9
  136. honeycomb/_generated/models/board_view_filter_operation.py +1 -0
  137. honeycomb/_generated/models/board_view_response.py +2 -5
  138. honeycomb/_generated/models/budget_rate.py +4 -12
  139. honeycomb/_generated/models/budget_rate_alert_type.py +1 -0
  140. honeycomb/_generated/models/burn_alert_shared_params.py +4 -12
  141. honeycomb/_generated/models/calculated_field.py +2 -9
  142. honeycomb/_generated/models/configuration_key_attributes.py +16 -12
  143. honeycomb/_generated/models/configuration_key_attributes_key_type.py +1 -0
  144. honeycomb/_generated/models/configuration_key_attributes_permissions.py +172 -0
  145. honeycomb/_generated/models/configuration_key_attributes_timestamps.py +4 -12
  146. honeycomb/_generated/models/configuration_key_request.py +101 -0
  147. honeycomb/_generated/models/configuration_key_request_attributes.py +107 -0
  148. honeycomb/_generated/models/configuration_key_request_attributes_permissions.py +168 -0
  149. honeycomb/_generated/models/configuration_key_request_type.py +8 -0
  150. honeycomb/_generated/models/create_board_view_request.py +2 -3
  151. honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +10 -10
  152. honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +1 -7
  153. honeycomb/_generated/models/create_column.py +2 -9
  154. honeycomb/_generated/models/create_column_type.py +1 -0
  155. honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +8 -6
  156. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +10 -7
  157. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +8 -8
  158. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +8 -6
  159. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  160. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  161. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  162. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  163. 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 +1 -0
  164. 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 +8 -6
  165. 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 +8 -6
  166. 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 +2 -9
  167. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +1 -0
  168. honeycomb/_generated/models/create_environment_request.py +8 -6
  169. honeycomb/_generated/models/create_environment_request_data.py +10 -7
  170. honeycomb/_generated/models/create_environment_request_data_attributes.py +2 -9
  171. honeycomb/_generated/models/create_environment_request_data_type.py +1 -0
  172. honeycomb/_generated/models/create_events_content_encoding.py +1 -0
  173. honeycomb/_generated/models/create_events_response_200_item.py +2 -9
  174. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +10 -10
  175. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +1 -7
  176. honeycomb/_generated/models/create_map_dependencies_request.py +2 -5
  177. honeycomb/_generated/models/create_map_dependencies_response.py +4 -10
  178. honeycomb/_generated/models/create_map_dependencies_response_status.py +1 -0
  179. honeycomb/_generated/models/create_pipeline_health_record_request.py +8 -6
  180. honeycomb/_generated/models/create_pipeline_health_record_request_data.py +10 -7
  181. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +8 -8
  182. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +8 -6
  183. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  184. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  185. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  186. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  187. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  188. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  189. 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 +8 -6
  190. 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 +2 -9
  191. honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +1 -0
  192. honeycomb/_generated/models/create_query_result_request.py +2 -9
  193. honeycomb/_generated/models/dataset.py +2 -6
  194. honeycomb/_generated/models/dataset_creation_payload.py +2 -9
  195. honeycomb/_generated/models/dataset_definition_type_1.py +4 -10
  196. honeycomb/_generated/models/dataset_definition_type_1_column_type.py +1 -0
  197. honeycomb/_generated/models/dataset_definitions.py +2 -6
  198. honeycomb/_generated/models/dataset_relationship.py +2 -3
  199. honeycomb/_generated/models/dataset_relationship_data.py +2 -8
  200. honeycomb/_generated/models/dataset_relationship_data_type.py +1 -0
  201. honeycomb/_generated/models/dataset_settings.py +2 -9
  202. honeycomb/_generated/models/dataset_update_payload.py +8 -8
  203. honeycomb/_generated/models/dataset_update_payload_settings.py +2 -9
  204. honeycomb/_generated/models/detailed_error.py +2 -9
  205. honeycomb/_generated/models/email_recipient.py +4 -7
  206. honeycomb/_generated/models/email_recipient_details.py +1 -7
  207. honeycomb/_generated/models/email_recipient_type.py +1 -0
  208. honeycomb/_generated/models/environment.py +6 -7
  209. honeycomb/_generated/models/environment_attributes.py +11 -9
  210. honeycomb/_generated/models/environment_attributes_color_type_1.py +1 -0
  211. honeycomb/_generated/models/environment_attributes_settings.py +1 -7
  212. honeycomb/_generated/models/environment_color.py +1 -0
  213. honeycomb/_generated/models/environment_links.py +1 -7
  214. honeycomb/_generated/models/environment_list_response.py +2 -5
  215. honeycomb/_generated/models/environment_relationship.py +8 -6
  216. honeycomb/_generated/models/environment_relationship_data.py +3 -8
  217. honeycomb/_generated/models/environment_relationship_data_type.py +1 -0
  218. honeycomb/_generated/models/environment_response.py +2 -3
  219. honeycomb/_generated/models/environment_type.py +1 -0
  220. honeycomb/_generated/models/error.py +2 -9
  221. honeycomb/_generated/models/event.py +2 -8
  222. honeycomb/_generated/models/exhaustion_time.py +4 -12
  223. honeycomb/_generated/models/exhaustion_time_alert_type.py +1 -0
  224. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +10 -10
  225. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +2 -9
  226. honeycomb/_generated/models/filter_op.py +1 -0
  227. honeycomb/_generated/models/get_map_dependencies_response.py +7 -10
  228. honeycomb/_generated/models/get_map_dependencies_response_status.py +1 -0
  229. honeycomb/_generated/models/having_calculate_op.py +1 -0
  230. honeycomb/_generated/models/having_op.py +1 -0
  231. honeycomb/_generated/models/included_resource.py +6 -7
  232. honeycomb/_generated/models/included_resource_attributes.py +1 -7
  233. honeycomb/_generated/models/ingest_key_attributes.py +14 -11
  234. honeycomb/_generated/models/ingest_key_attributes_key_type.py +1 -0
  235. honeycomb/_generated/models/ingest_key_attributes_permissions.py +2 -9
  236. honeycomb/_generated/models/ingest_key_attributes_timestamps.py +4 -12
  237. honeycomb/_generated/models/ingest_key_request.py +100 -0
  238. honeycomb/_generated/models/ingest_key_request_attributes.py +75 -0
  239. honeycomb/_generated/models/ingest_key_request_type.py +8 -0
  240. honeycomb/_generated/models/ingest_key_type.py +2 -9
  241. honeycomb/_generated/models/ingest_key_type_key_type.py +1 -0
  242. honeycomb/_generated/models/jsonapi_error_source.py +2 -9
  243. honeycomb/_generated/models/kinesis_event.py +2 -5
  244. honeycomb/_generated/models/kinesis_event_record.py +2 -9
  245. honeycomb/_generated/models/kinesis_response.py +2 -9
  246. honeycomb/_generated/models/list_api_keys_filtertype.py +1 -0
  247. honeycomb/_generated/models/map_dependency.py +2 -5
  248. honeycomb/_generated/models/map_node.py +2 -9
  249. honeycomb/_generated/models/map_node_type.py +1 -0
  250. honeycomb/_generated/models/marker.py +2 -9
  251. honeycomb/_generated/models/marker_create_request.py +2 -3
  252. honeycomb/_generated/models/marker_create_request_data.py +16 -10
  253. honeycomb/_generated/models/marker_create_request_data_attributes.py +2 -9
  254. honeycomb/_generated/models/marker_create_request_data_relationships.py +2 -3
  255. honeycomb/_generated/models/marker_create_request_data_type.py +1 -0
  256. honeycomb/_generated/models/marker_object.py +7 -8
  257. honeycomb/_generated/models/marker_object_attributes.py +8 -8
  258. honeycomb/_generated/models/marker_object_attributes_timestamps.py +4 -12
  259. honeycomb/_generated/models/marker_object_links.py +2 -9
  260. honeycomb/_generated/models/marker_object_relationships.py +8 -8
  261. honeycomb/_generated/models/marker_object_relationships_dataset.py +8 -9
  262. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +4 -10
  263. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +1 -0
  264. honeycomb/_generated/models/marker_object_type.py +1 -0
  265. honeycomb/_generated/models/marker_response.py +2 -3
  266. honeycomb/_generated/models/marker_setting.py +2 -10
  267. honeycomb/_generated/models/marker_update_request.py +2 -3
  268. honeycomb/_generated/models/marker_update_request_data.py +16 -10
  269. honeycomb/_generated/models/marker_update_request_data_attributes.py +2 -9
  270. honeycomb/_generated/models/marker_update_request_data_relationships.py +2 -3
  271. honeycomb/_generated/models/marker_update_request_data_type.py +1 -0
  272. honeycomb/_generated/models/ms_teams_recipient.py +4 -7
  273. honeycomb/_generated/models/ms_teams_recipient_details.py +1 -7
  274. honeycomb/_generated/models/ms_teams_recipient_type.py +1 -0
  275. honeycomb/_generated/models/ms_teams_workflow_recipient.py +12 -11
  276. honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +1 -7
  277. honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +1 -0
  278. honeycomb/_generated/models/notification_recipient.py +8 -8
  279. honeycomb/_generated/models/notification_recipient_details.py +10 -9
  280. honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +1 -0
  281. honeycomb/_generated/models/notification_recipient_details_variables_item.py +2 -9
  282. honeycomb/_generated/models/pager_duty_recipient.py +8 -9
  283. honeycomb/_generated/models/pager_duty_recipient_details.py +1 -7
  284. honeycomb/_generated/models/pager_duty_recipient_type.py +1 -0
  285. honeycomb/_generated/models/pagination_links.py +2 -8
  286. honeycomb/_generated/models/payload_template.py +2 -9
  287. honeycomb/_generated/models/pipeline_configuration_response.py +16 -10
  288. honeycomb/_generated/models/pipeline_configuration_response_attributes.py +8 -8
  289. honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +1 -7
  290. honeycomb/_generated/models/pipeline_configuration_response_links.py +2 -9
  291. honeycomb/_generated/models/pipeline_configuration_response_type.py +1 -0
  292. honeycomb/_generated/models/pipeline_configuration_rollout.py +16 -10
  293. honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +3 -8
  294. honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +1 -0
  295. honeycomb/_generated/models/pipeline_configuration_rollout_links.py +2 -9
  296. honeycomb/_generated/models/pipeline_configuration_rollout_type.py +1 -0
  297. honeycomb/_generated/models/preset_filter.py +1 -7
  298. honeycomb/_generated/models/query.py +11 -11
  299. honeycomb/_generated/models/query_annotation.py +4 -12
  300. honeycomb/_generated/models/query_annotation_source.py +1 -0
  301. honeycomb/_generated/models/query_calculated_fields_item.py +1 -7
  302. honeycomb/_generated/models/query_calculations_item.py +2 -10
  303. honeycomb/_generated/models/query_compare_time_offset_seconds.py +1 -0
  304. honeycomb/_generated/models/query_filter_combination.py +1 -0
  305. honeycomb/_generated/models/query_filters_item.py +2 -11
  306. honeycomb/_generated/models/query_havings_item.py +2 -10
  307. honeycomb/_generated/models/query_op.py +1 -0
  308. honeycomb/_generated/models/query_orders_item.py +2 -9
  309. honeycomb/_generated/models/query_orders_item_order.py +1 -0
  310. honeycomb/_generated/models/query_panel.py +2 -6
  311. honeycomb/_generated/models/query_panel_query_panel.py +10 -9
  312. honeycomb/_generated/models/query_panel_query_panel_query_style.py +1 -0
  313. honeycomb/_generated/models/query_result.py +2 -5
  314. honeycomb/_generated/models/query_result_details.py +5 -8
  315. honeycomb/_generated/models/query_result_details_data.py +5 -8
  316. honeycomb/_generated/models/query_result_details_links.py +2 -9
  317. honeycomb/_generated/models/query_result_links.py +2 -9
  318. honeycomb/_generated/models/query_results_data.py +2 -5
  319. honeycomb/_generated/models/query_results_data_data.py +2 -8
  320. honeycomb/_generated/models/query_results_series.py +2 -5
  321. honeycomb/_generated/models/recipient_properties.py +4 -12
  322. honeycomb/_generated/models/recipient_type.py +1 -0
  323. honeycomb/_generated/models/slack_recipient.py +4 -7
  324. honeycomb/_generated/models/slack_recipient_details.py +1 -7
  325. honeycomb/_generated/models/slack_recipient_type.py +1 -0
  326. honeycomb/_generated/models/slo.py +4 -8
  327. honeycomb/_generated/models/slo_create.py +4 -8
  328. honeycomb/_generated/models/slo_create_sli.py +1 -7
  329. honeycomb/_generated/models/slo_detailed_response.py +4 -8
  330. honeycomb/_generated/models/slo_detailed_response_status.py +1 -0
  331. honeycomb/_generated/models/slo_history.py +2 -9
  332. honeycomb/_generated/models/slo_history_request.py +2 -8
  333. honeycomb/_generated/models/slo_history_response.py +2 -3
  334. honeycomb/_generated/models/slo_panel.py +2 -6
  335. honeycomb/_generated/models/slo_panel_slo_panel.py +2 -9
  336. honeycomb/_generated/models/slo_sli.py +1 -7
  337. honeycomb/_generated/models/tag.py +1 -7
  338. honeycomb/_generated/models/team_relationship.py +2 -3
  339. honeycomb/_generated/models/team_relationship_team.py +6 -5
  340. honeycomb/_generated/models/team_relationship_team_data.py +3 -8
  341. honeycomb/_generated/models/team_relationship_team_data_type.py +1 -0
  342. honeycomb/_generated/models/template_variable_definition.py +2 -9
  343. honeycomb/_generated/models/text_panel.py +2 -6
  344. honeycomb/_generated/models/text_panel_text_panel.py +1 -7
  345. honeycomb/_generated/models/trigger_response.py +27 -21
  346. honeycomb/_generated/models/trigger_with_inline_query.py +27 -21
  347. honeycomb/_generated/models/trigger_with_inline_query_query.py +1 -7
  348. honeycomb/_generated/models/trigger_with_query_reference.py +21 -18
  349. honeycomb/_generated/models/update_board_view_request.py +2 -5
  350. honeycomb/_generated/models/update_environment_request.py +8 -6
  351. honeycomb/_generated/models/update_environment_request_data.py +10 -7
  352. honeycomb/_generated/models/update_environment_request_data_attributes.py +8 -8
  353. honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +2 -9
  354. honeycomb/_generated/models/update_environment_request_data_type.py +1 -0
  355. honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +4 -7
  356. honeycomb/_generated/models/update_pipeline_configuration_rollout.py +10 -7
  357. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +3 -8
  358. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +1 -0
  359. honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +8 -6
  360. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +10 -7
  361. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +3 -8
  362. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +1 -0
  363. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +1 -0
  364. honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +8 -6
  365. honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +1 -0
  366. honeycomb/_generated/models/user_relationship.py +2 -3
  367. honeycomb/_generated/models/user_relationship_data.py +2 -8
  368. honeycomb/_generated/models/user_relationship_data_type.py +1 -0
  369. honeycomb/_generated/models/validation_error.py +8 -8
  370. honeycomb/_generated/models/validation_error_type_detail_item.py +4 -10
  371. honeycomb/_generated/models/validation_error_type_detail_item_code.py +1 -0
  372. honeycomb/_generated/models/webhook_header.py +2 -9
  373. honeycomb/_generated/models/webhook_recipient.py +4 -7
  374. honeycomb/_generated/models/webhook_recipient_details.py +8 -8
  375. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +12 -10
  376. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +2 -5
  377. honeycomb/_generated/models/webhook_recipient_type.py +1 -0
  378. honeycomb/_generated/types.py +1 -1
  379. honeycomb/cli/__init__.py +85 -0
  380. honeycomb/cli/api_keys.py +205 -0
  381. honeycomb/cli/auth.py +70 -0
  382. honeycomb/cli/boards.py +203 -0
  383. honeycomb/cli/columns.py +256 -0
  384. honeycomb/cli/config.py +259 -0
  385. honeycomb/cli/datasets.py +186 -0
  386. honeycomb/cli/derived_columns.py +222 -0
  387. honeycomb/cli/environments.py +240 -0
  388. honeycomb/cli/formatters.py +242 -0
  389. honeycomb/cli/markers.py +151 -0
  390. honeycomb/cli/queries.py +380 -0
  391. honeycomb/cli/recipients.py +211 -0
  392. honeycomb/cli/slos.py +338 -0
  393. honeycomb/cli/triggers.py +271 -0
  394. honeycomb/client.py +13 -7
  395. honeycomb/models/__init__.py +18 -3
  396. honeycomb/models/api_keys.py +49 -5
  397. honeycomb/models/auth.py +71 -0
  398. honeycomb/models/board_builder.py +97 -25
  399. honeycomb/models/boards.py +95 -1
  400. honeycomb/models/datasets.py +42 -0
  401. honeycomb/models/queries.py +21 -0
  402. honeycomb/models/query_builder.py +119 -59
  403. honeycomb/models/recipient_builder.py +51 -4
  404. honeycomb/models/slo_builder.py +24 -19
  405. honeycomb/models/slos.py +50 -3
  406. honeycomb/models/tool_inputs.py +630 -0
  407. honeycomb/models/triggers.py +39 -9
  408. honeycomb/resources/__init__.py +2 -0
  409. honeycomb/resources/api_keys.py +66 -29
  410. honeycomb/resources/auth.py +97 -0
  411. honeycomb/resources/boards.py +272 -18
  412. honeycomb/resources/datasets.py +49 -11
  413. honeycomb/resources/environments.py +54 -31
  414. honeycomb/resources/slos.py +87 -61
  415. honeycomb/tools/__main__.py +40 -4
  416. honeycomb/tools/builders.py +235 -150
  417. honeycomb/tools/descriptions.py +175 -7
  418. honeycomb/tools/executor.py +212 -25
  419. honeycomb/tools/generator.py +61 -2264
  420. honeycomb/tools/resources/__init__.py +42 -0
  421. honeycomb/tools/resources/api_keys.py +249 -0
  422. honeycomb/tools/resources/auth.py +98 -0
  423. honeycomb/tools/resources/boards.py +313 -0
  424. honeycomb/tools/resources/burn_alerts.py +278 -0
  425. honeycomb/tools/resources/columns.py +257 -0
  426. honeycomb/tools/resources/datasets.py +215 -0
  427. honeycomb/tools/resources/derived_columns.py +311 -0
  428. honeycomb/tools/resources/environments.py +211 -0
  429. honeycomb/tools/resources/events.py +158 -0
  430. honeycomb/tools/resources/marker_settings.py +216 -0
  431. honeycomb/tools/resources/markers.py +197 -0
  432. honeycomb/tools/resources/queries.py +220 -0
  433. honeycomb/tools/resources/recipients.py +297 -0
  434. honeycomb/tools/resources/service_map.py +110 -0
  435. honeycomb/tools/resources/slos.py +276 -0
  436. honeycomb/tools/resources/triggers.py +328 -0
  437. honeycomb/tools/schemas.py +81 -0
  438. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/METADATA +33 -8
  439. honeycomb_api-0.5.3.dist-info/RECORD +497 -0
  440. honeycomb_api-0.5.3.dist-info/entry_points.txt +5 -0
  441. honeycomb_api-0.1.0.dist-info/RECORD +0 -453
  442. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/WHEEL +0 -0
  443. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/licenses/LICENSE +0 -0
@@ -20,6 +20,7 @@ class EnvironmentsResource(BaseResource):
20
20
 
21
21
  This resource requires Management Key authentication and operates
22
22
  on a specific team. Environments help organize your data and API keys.
23
+ The team slug is automatically detected from the management key.
23
24
 
24
25
  Note:
25
26
  The list methods automatically paginate through all results. For teams
@@ -32,9 +33,8 @@ class EnvironmentsResource(BaseResource):
32
33
  ... management_key="hcamk_xxx",
33
34
  ... management_secret="xxx"
34
35
  ... ) as client:
35
- ... envs = await client.environments.list_async(team="my-team")
36
+ ... envs = await client.environments.list_async()
36
37
  ... env = await client.environments.create_async(
37
- ... team="my-team",
38
38
  ... environment=EnvironmentCreate(
39
39
  ... name="Production",
40
40
  ... description="Production environment",
@@ -48,11 +48,40 @@ class EnvironmentsResource(BaseResource):
48
48
  ... management_secret="xxx",
49
49
  ... sync=True
50
50
  ... ) as client:
51
- ... envs = client.environments.list(team="my-team")
51
+ ... envs = client.environments.list()
52
52
  """
53
53
 
54
54
  def __init__(self, client: HoneycombClient) -> None:
55
55
  super().__init__(client)
56
+ self._cached_team_slug: str | None = None
57
+
58
+ async def _get_team_slug_async(self) -> str:
59
+ """Get team slug, auto-detecting from auth."""
60
+ # Use cached value if available
61
+ if self._cached_team_slug:
62
+ return self._cached_team_slug
63
+
64
+ # Auto-detect from auth endpoint
65
+ auth_info = await self._client.auth.get_async()
66
+ if not hasattr(auth_info, "team_slug") or not auth_info.team_slug:
67
+ raise ValueError("Cannot auto-detect team slug from management key credentials.")
68
+
69
+ self._cached_team_slug = auth_info.team_slug
70
+ return self._cached_team_slug
71
+
72
+ def _get_team_slug(self) -> str:
73
+ """Get team slug (sync), auto-detecting from auth."""
74
+ # Use cached value if available
75
+ if self._cached_team_slug:
76
+ return self._cached_team_slug
77
+
78
+ # Auto-detect from auth endpoint
79
+ auth_info = self._client.auth.get()
80
+ if not hasattr(auth_info, "team_slug") or not auth_info.team_slug:
81
+ raise ValueError("Cannot auto-detect team slug from management key credentials.")
82
+
83
+ self._cached_team_slug = auth_info.team_slug
84
+ return self._cached_team_slug
56
85
 
57
86
  def _build_path(self, team: str, env_id: str | None = None) -> str:
58
87
  """Build API path for environments."""
@@ -85,15 +114,12 @@ class EnvironmentsResource(BaseResource):
85
114
  # Async methods
86
115
  # -------------------------------------------------------------------------
87
116
 
88
- async def list_async(self, team: str) -> list[Environment]:
89
- """List all environments for a team (async).
117
+ async def list_async(self) -> list[Environment]:
118
+ """List all environments for the authenticated team (async).
90
119
 
91
120
  Automatically paginates through all results. For teams with many environments,
92
121
  this may result in multiple API requests.
93
122
 
94
- Args:
95
- team: Team slug.
96
-
97
123
  Returns:
98
124
  List of Environment objects.
99
125
 
@@ -101,6 +127,7 @@ class EnvironmentsResource(BaseResource):
101
127
  The default rate limit is 100 requests per minute per operation.
102
128
  Contact Honeycomb support for higher limits: https://www.honeycomb.io/support
103
129
  """
130
+ team = await self._get_team_slug_async()
104
131
  results: list[Environment] = []
105
132
  cursor: str | None = None
106
133
  path = self._build_path(team)
@@ -124,29 +151,29 @@ class EnvironmentsResource(BaseResource):
124
151
 
125
152
  return results
126
153
 
127
- async def get_async(self, team: str, env_id: str) -> Environment:
154
+ async def get_async(self, env_id: str) -> Environment:
128
155
  """Get a specific environment (async).
129
156
 
130
157
  Args:
131
- team: Team slug.
132
158
  env_id: Environment ID.
133
159
 
134
160
  Returns:
135
161
  Environment object.
136
162
  """
163
+ team = await self._get_team_slug_async()
137
164
  data = await self._get_async(self._build_path(team, env_id))
138
165
  return Environment.from_jsonapi(data)
139
166
 
140
- async def create_async(self, team: str, environment: EnvironmentCreate) -> Environment:
167
+ async def create_async(self, environment: EnvironmentCreate) -> Environment:
141
168
  """Create a new environment (async).
142
169
 
143
170
  Args:
144
- team: Team slug.
145
171
  environment: Environment configuration.
146
172
 
147
173
  Returns:
148
174
  Created Environment object.
149
175
  """
176
+ team = await self._get_team_slug_async()
150
177
  data = await self._post_async(
151
178
  self._build_path(team),
152
179
  json=environment.to_jsonapi(),
@@ -154,19 +181,17 @@ class EnvironmentsResource(BaseResource):
154
181
  )
155
182
  return Environment.from_jsonapi(data)
156
183
 
157
- async def update_async(
158
- self, team: str, env_id: str, environment: EnvironmentUpdate
159
- ) -> Environment:
184
+ async def update_async(self, env_id: str, environment: EnvironmentUpdate) -> Environment:
160
185
  """Update an existing environment (async).
161
186
 
162
187
  Args:
163
- team: Team slug.
164
188
  env_id: Environment ID.
165
189
  environment: Updated environment configuration.
166
190
 
167
191
  Returns:
168
192
  Updated Environment object.
169
193
  """
194
+ team = await self._get_team_slug_async()
170
195
  data = await self._patch_async(
171
196
  self._build_path(team, env_id),
172
197
  json=environment.to_jsonapi(env_id),
@@ -174,28 +199,25 @@ class EnvironmentsResource(BaseResource):
174
199
  )
175
200
  return Environment.from_jsonapi(data)
176
201
 
177
- async def delete_async(self, team: str, env_id: str) -> None:
202
+ async def delete_async(self, env_id: str) -> None:
178
203
  """Delete an environment (async).
179
204
 
180
205
  Args:
181
- team: Team slug.
182
206
  env_id: Environment ID.
183
207
  """
208
+ team = await self._get_team_slug_async()
184
209
  await self._delete_async(self._build_path(team, env_id))
185
210
 
186
211
  # -------------------------------------------------------------------------
187
212
  # Sync methods
188
213
  # -------------------------------------------------------------------------
189
214
 
190
- def list(self, team: str) -> list[Environment]:
191
- """List all environments for a team.
215
+ def list(self) -> list[Environment]:
216
+ """List all environments for the authenticated team.
192
217
 
193
218
  Automatically paginates through all results. For teams with many environments,
194
219
  this may result in multiple API requests.
195
220
 
196
- Args:
197
- team: Team slug.
198
-
199
221
  Returns:
200
222
  List of Environment objects.
201
223
 
@@ -206,6 +228,7 @@ class EnvironmentsResource(BaseResource):
206
228
  if not self._client.is_sync:
207
229
  raise RuntimeError("Use list_async() for async mode, or pass sync=True to client")
208
230
 
231
+ team = self._get_team_slug()
209
232
  results: list[Environment] = []
210
233
  cursor: str | None = None
211
234
  path = self._build_path(team)
@@ -229,11 +252,10 @@ class EnvironmentsResource(BaseResource):
229
252
 
230
253
  return results
231
254
 
232
- def get(self, team: str, env_id: str) -> Environment:
255
+ def get(self, env_id: str) -> Environment:
233
256
  """Get a specific environment.
234
257
 
235
258
  Args:
236
- team: Team slug.
237
259
  env_id: Environment ID.
238
260
 
239
261
  Returns:
@@ -241,14 +263,14 @@ class EnvironmentsResource(BaseResource):
241
263
  """
242
264
  if not self._client.is_sync:
243
265
  raise RuntimeError("Use get_async() for async mode, or pass sync=True to client")
266
+ team = self._get_team_slug()
244
267
  data = self._get_sync(self._build_path(team, env_id))
245
268
  return Environment.from_jsonapi(data)
246
269
 
247
- def create(self, team: str, environment: EnvironmentCreate) -> Environment:
270
+ def create(self, environment: EnvironmentCreate) -> Environment:
248
271
  """Create a new environment.
249
272
 
250
273
  Args:
251
- team: Team slug.
252
274
  environment: Environment configuration.
253
275
 
254
276
  Returns:
@@ -256,6 +278,7 @@ class EnvironmentsResource(BaseResource):
256
278
  """
257
279
  if not self._client.is_sync:
258
280
  raise RuntimeError("Use create_async() for async mode, or pass sync=True to client")
281
+ team = self._get_team_slug()
259
282
  data = self._post_sync(
260
283
  self._build_path(team),
261
284
  json=environment.to_jsonapi(),
@@ -263,11 +286,10 @@ class EnvironmentsResource(BaseResource):
263
286
  )
264
287
  return Environment.from_jsonapi(data)
265
288
 
266
- def update(self, team: str, env_id: str, environment: EnvironmentUpdate) -> Environment:
289
+ def update(self, env_id: str, environment: EnvironmentUpdate) -> Environment:
267
290
  """Update an existing environment.
268
291
 
269
292
  Args:
270
- team: Team slug.
271
293
  env_id: Environment ID.
272
294
  environment: Updated environment configuration.
273
295
 
@@ -276,6 +298,7 @@ class EnvironmentsResource(BaseResource):
276
298
  """
277
299
  if not self._client.is_sync:
278
300
  raise RuntimeError("Use update_async() for async mode, or pass sync=True to client")
301
+ team = self._get_team_slug()
279
302
  data = self._patch_sync(
280
303
  self._build_path(team, env_id),
281
304
  json=environment.to_jsonapi(env_id),
@@ -283,13 +306,13 @@ class EnvironmentsResource(BaseResource):
283
306
  )
284
307
  return Environment.from_jsonapi(data)
285
308
 
286
- def delete(self, team: str, env_id: str) -> None:
309
+ def delete(self, env_id: str) -> None:
287
310
  """Delete an environment.
288
311
 
289
312
  Args:
290
- team: Team slug.
291
313
  env_id: Environment ID.
292
314
  """
293
315
  if not self._client.is_sync:
294
316
  raise RuntimeError("Use delete_async() for async mode, or pass sync=True to client")
317
+ team = self._get_team_slug()
295
318
  self._delete_sync(self._build_path(team, env_id))
@@ -115,14 +115,16 @@ class SLOsResource(BaseResource):
115
115
 
116
116
  This method handles the full orchestration of creating an SLO bundle:
117
117
  1. Creates derived column if needed (environment-wide or dataset-scoped)
118
- 2. Creates SLO in each specified dataset
119
- 3. Creates burn alerts for each SLO (if configured)
118
+ 2. Creates SLO (single-dataset or multi-dataset)
119
+ 3. Creates burn alerts for the SLO (if configured)
120
120
 
121
121
  Args:
122
122
  bundle: SLOBundle from SLOBuilder.build()
123
123
 
124
124
  Returns:
125
- Dictionary mapping dataset slugs to created SLO objects
125
+ Dictionary mapping dataset slugs to created SLO objects.
126
+ For single-dataset SLOs: {"dataset": slo}
127
+ For multi-dataset SLOs: {"dataset1": slo, "dataset2": slo, ...} (same SLO object)
126
128
 
127
129
  Example:
128
130
  >>> bundle = (
@@ -153,39 +155,50 @@ class SLOsResource(BaseResource):
153
155
  bundle.datasets[0], bundle.derived_column
154
156
  )
155
157
 
156
- # Step 2: Create SLO in each dataset
157
- for dataset in bundle.datasets:
158
+ # Step 2: Create SLO
159
+ is_multi_dataset = bundle.slo.dataset_slugs is not None
160
+ if is_multi_dataset:
161
+ # Multi-dataset SLO: create once via __all__ endpoint
162
+ slo = await self.create_async("__all__", bundle.slo)
163
+ # Add to dict for each dataset
164
+ for dataset in bundle.datasets:
165
+ created_slos[dataset] = slo
166
+ else:
167
+ # Single-dataset SLO: create in the specified dataset
168
+ dataset = bundle.datasets[0]
158
169
  slo = await self.create_async(dataset, bundle.slo)
159
170
  created_slos[dataset] = slo
160
171
 
161
- # Step 3: Create burn alerts for this SLO
162
- for alert_def in bundle.burn_alerts:
163
- # Process inline recipients with idempotent handling
164
- from ._recipient_utils import process_inline_recipients
172
+ # Step 3: Create burn alerts for the SLO
173
+ # For multi-dataset SLOs, create burn alerts in the first dataset
174
+ burn_alert_dataset = bundle.datasets[0]
175
+ for alert_def in bundle.burn_alerts:
176
+ # Process inline recipients with idempotent handling
177
+ from ._recipient_utils import process_inline_recipients
165
178
 
166
- processed_recipients = await process_inline_recipients(
167
- self._client, alert_def.recipients.copy()
168
- )
179
+ processed_recipients = await process_inline_recipients(
180
+ self._client, alert_def.recipients.copy()
181
+ )
169
182
 
170
- # Convert recipients to BurnAlertRecipient format
171
- recipients = [BurnAlertRecipient(**recipient) for recipient in processed_recipients]
172
-
173
- # Convert budget rate percent to per-million if needed
174
- budget_rate_threshold = None
175
- if alert_def.budget_rate_decrease_percent is not None:
176
- budget_rate_threshold = int(alert_def.budget_rate_decrease_percent * 10000)
177
-
178
- burn_alert = BurnAlertCreate(
179
- alert_type=alert_def.alert_type,
180
- slo_id=slo.id,
181
- description=alert_def.description,
182
- exhaustion_minutes=alert_def.exhaustion_minutes,
183
- budget_rate_window_minutes=alert_def.budget_rate_window_minutes,
184
- budget_rate_decrease_threshold_per_million=budget_rate_threshold,
185
- recipients=recipients if recipients else [],
186
- )
183
+ # Convert recipients to BurnAlertRecipient format
184
+ recipients = [BurnAlertRecipient(**recipient) for recipient in processed_recipients]
185
+
186
+ # Convert budget rate percent to per-million if needed
187
+ budget_rate_threshold = None
188
+ if alert_def.budget_rate_decrease_percent is not None:
189
+ budget_rate_threshold = int(alert_def.budget_rate_decrease_percent * 10000)
190
+
191
+ burn_alert = BurnAlertCreate(
192
+ alert_type=alert_def.alert_type,
193
+ slo_id=slo.id,
194
+ description=alert_def.description,
195
+ exhaustion_minutes=alert_def.exhaustion_minutes,
196
+ budget_rate_window_minutes=alert_def.budget_rate_window_minutes,
197
+ budget_rate_decrease_threshold_per_million=budget_rate_threshold,
198
+ recipients=recipients if recipients else [],
199
+ )
187
200
 
188
- await self._client.burn_alerts.create_async(dataset, burn_alert)
201
+ await self._client.burn_alerts.create_async(burn_alert_dataset, burn_alert)
189
202
 
190
203
  return created_slos
191
204
 
@@ -273,14 +286,16 @@ class SLOsResource(BaseResource):
273
286
 
274
287
  This method handles the full orchestration of creating an SLO bundle:
275
288
  1. Creates derived column if needed (environment-wide or dataset-scoped)
276
- 2. Creates SLO in each specified dataset
277
- 3. Creates burn alerts for each SLO (if configured)
289
+ 2. Creates SLO (single-dataset or multi-dataset)
290
+ 3. Creates burn alerts for the SLO (if configured)
278
291
 
279
292
  Args:
280
293
  bundle: SLOBundle from SLOBuilder.build()
281
294
 
282
295
  Returns:
283
- Dictionary mapping dataset slugs to created SLO objects
296
+ Dictionary mapping dataset slugs to created SLO objects.
297
+ For single-dataset SLOs: {"dataset": slo}
298
+ For multi-dataset SLOs: {"dataset1": slo, "dataset2": slo, ...} (same SLO object)
284
299
 
285
300
  Example:
286
301
  >>> bundle = (
@@ -314,40 +329,51 @@ class SLOsResource(BaseResource):
314
329
  # Create in first dataset (single-dataset SLO)
315
330
  self._client.derived_columns.create(bundle.datasets[0], bundle.derived_column)
316
331
 
317
- # Step 2: Create SLO in each dataset
318
- for dataset in bundle.datasets:
332
+ # Step 2: Create SLO
333
+ is_multi_dataset = bundle.slo.dataset_slugs is not None
334
+ if is_multi_dataset:
335
+ # Multi-dataset SLO: create once via __all__ endpoint
336
+ slo = self.create("__all__", bundle.slo)
337
+ # Add to dict for each dataset
338
+ for dataset in bundle.datasets:
339
+ created_slos[dataset] = slo
340
+ else:
341
+ # Single-dataset SLO: create in the specified dataset
342
+ dataset = bundle.datasets[0]
319
343
  slo = self.create(dataset, bundle.slo)
320
344
  created_slos[dataset] = slo
321
345
 
322
- # Step 3: Create burn alerts for this SLO
323
- for alert_def in bundle.burn_alerts:
324
- # Process inline recipients with idempotent handling
325
- import asyncio
346
+ # Step 3: Create burn alerts for the SLO
347
+ # For multi-dataset SLOs, create burn alerts in the first dataset
348
+ burn_alert_dataset = bundle.datasets[0]
349
+ for alert_def in bundle.burn_alerts:
350
+ # Process inline recipients with idempotent handling
351
+ import asyncio
326
352
 
327
- from ._recipient_utils import process_inline_recipients
353
+ from ._recipient_utils import process_inline_recipients
328
354
 
329
- processed_recipients = asyncio.run(
330
- process_inline_recipients(self._client, alert_def.recipients.copy())
331
- )
355
+ processed_recipients = asyncio.run(
356
+ process_inline_recipients(self._client, alert_def.recipients.copy())
357
+ )
332
358
 
333
- # Convert recipients to BurnAlertRecipient format
334
- recipients = [BurnAlertRecipient(**recipient) for recipient in processed_recipients]
335
-
336
- # Convert budget rate percent to per-million if needed
337
- budget_rate_threshold = None
338
- if alert_def.budget_rate_decrease_percent is not None:
339
- budget_rate_threshold = int(alert_def.budget_rate_decrease_percent * 10000)
340
-
341
- burn_alert = BurnAlertCreate(
342
- alert_type=alert_def.alert_type,
343
- slo_id=slo.id,
344
- description=alert_def.description,
345
- exhaustion_minutes=alert_def.exhaustion_minutes,
346
- budget_rate_window_minutes=alert_def.budget_rate_window_minutes,
347
- budget_rate_decrease_threshold_per_million=budget_rate_threshold,
348
- recipients=recipients if recipients else [],
349
- )
359
+ # Convert recipients to BurnAlertRecipient format
360
+ recipients = [BurnAlertRecipient(**recipient) for recipient in processed_recipients]
361
+
362
+ # Convert budget rate percent to per-million if needed
363
+ budget_rate_threshold = None
364
+ if alert_def.budget_rate_decrease_percent is not None:
365
+ budget_rate_threshold = int(alert_def.budget_rate_decrease_percent * 10000)
366
+
367
+ burn_alert = BurnAlertCreate(
368
+ alert_type=alert_def.alert_type,
369
+ slo_id=slo.id,
370
+ description=alert_def.description,
371
+ exhaustion_minutes=alert_def.exhaustion_minutes,
372
+ budget_rate_window_minutes=alert_def.budget_rate_window_minutes,
373
+ budget_rate_decrease_threshold_per_million=budget_rate_threshold,
374
+ recipients=recipients if recipients else [],
375
+ )
350
376
 
351
- self._client.burn_alerts.create(dataset, burn_alert)
377
+ self._client.burn_alerts.create(burn_alert_dataset, burn_alert)
352
378
 
353
379
  return created_slos
@@ -3,6 +3,7 @@
3
3
  Usage:
4
4
  python -m honeycomb.tools generate --output tools.json
5
5
  python -m honeycomb.tools generate --resource triggers --output triggers.json
6
+ python -m honeycomb.tools generate --per-resource --output-dir tools/
6
7
  python -m honeycomb.tools validate tools.json
7
8
  python -m honeycomb.tools generate --format python --output definitions.py
8
9
  """
@@ -14,6 +15,7 @@ from pathlib import Path
14
15
 
15
16
  from honeycomb.tools.descriptions import validate_description
16
17
  from honeycomb.tools.generator import (
18
+ RESOURCE_MODULES,
17
19
  export_tools_json,
18
20
  export_tools_python,
19
21
  generate_all_tools,
@@ -21,6 +23,9 @@ from honeycomb.tools.generator import (
21
23
  )
22
24
  from honeycomb.tools.schemas import validate_schema, validate_tool_name
23
25
 
26
+ # All available resources
27
+ AVAILABLE_RESOURCES = list(RESOURCE_MODULES.keys())
28
+
24
29
 
25
30
  def cmd_generate(args: argparse.Namespace) -> int:
26
31
  """Generate tool definitions.
@@ -32,7 +37,28 @@ def cmd_generate(args: argparse.Namespace) -> int:
32
37
  Exit code (0 for success, 1 for error)
33
38
  """
34
39
  try:
35
- # Generate tools
40
+ # Validate arguments
41
+ if not args.per_resource and not args.output:
42
+ print("Error: --output is required unless using --per-resource", file=sys.stderr)
43
+ return 1
44
+
45
+ # Handle per-resource generation
46
+ if args.per_resource:
47
+ output_dir = Path(args.output_dir)
48
+ output_dir.mkdir(parents=True, exist_ok=True)
49
+
50
+ total_tools = 0
51
+ for resource in AVAILABLE_RESOURCES:
52
+ tools = generate_tools_for_resource(resource)
53
+ output_path = output_dir / f"{resource}.json"
54
+ export_tools_json(tools, str(output_path))
55
+ total_tools += len(tools)
56
+ print(f" {resource}.json: {len(tools)} tools")
57
+
58
+ print(f"Generated {total_tools} tools across {len(AVAILABLE_RESOURCES)} resource files")
59
+ return 0
60
+
61
+ # Generate tools (single file mode)
36
62
  if args.resource:
37
63
  tools = generate_tools_for_resource(args.resource)
38
64
  print(f"Generated {len(tools)} tool definitions for resource '{args.resource}'")
@@ -156,13 +182,12 @@ def main() -> int:
156
182
  gen_parser.add_argument(
157
183
  "--output",
158
184
  "-o",
159
- required=True,
160
- help="Output file path",
185
+ help="Output file path (required unless using --per-resource)",
161
186
  )
162
187
  gen_parser.add_argument(
163
188
  "--resource",
164
189
  "-r",
165
- choices=["triggers", "slos", "burn_alerts"],
190
+ choices=AVAILABLE_RESOURCES,
166
191
  help="Generate tools for specific resource only",
167
192
  )
168
193
  gen_parser.add_argument(
@@ -172,6 +197,17 @@ def main() -> int:
172
197
  default="json",
173
198
  help="Output format (default: json)",
174
199
  )
200
+ gen_parser.add_argument(
201
+ "--per-resource",
202
+ action="store_true",
203
+ help="Generate separate JSON files for each resource",
204
+ )
205
+ gen_parser.add_argument(
206
+ "--output-dir",
207
+ "-d",
208
+ default="tools",
209
+ help="Output directory for per-resource files (default: tools)",
210
+ )
175
211
 
176
212
  # Validate command
177
213
  val_parser = subparsers.add_parser(