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,387 @@
1
+ """Board Builder - Fluent interface for creating boards with panels."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import TYPE_CHECKING, Any, Literal
7
+
8
+ from honeycomb.models.tags_mixin import TagsMixin
9
+
10
+ if TYPE_CHECKING:
11
+ from honeycomb.models.query_builder import QueryBuilder
12
+ from honeycomb.models.slo_builder import SLOBuilder
13
+
14
+
15
+ # =============================================================================
16
+ # BoardBundle Data Structures
17
+ # =============================================================================
18
+
19
+
20
+ @dataclass
21
+ class QueryBuilderPanel:
22
+ """Query panel from inline QueryBuilder (needs creation).
23
+
24
+ Attributes:
25
+ builder: QueryBuilder instance with .name() set
26
+ position: Optional (x, y, width, height) for manual layout
27
+ style: Display style (graph, table, combo)
28
+ visualization: Optional visualization settings dict
29
+ dataset_override: Optional dataset override
30
+ """
31
+
32
+ builder: QueryBuilder
33
+ position: tuple[int, int, int, int] | None
34
+ style: Literal["graph", "table", "combo"]
35
+ visualization: dict[str, Any] | None
36
+ dataset_override: str | None
37
+
38
+
39
+ @dataclass
40
+ class ExistingQueryPanel:
41
+ """Query panel from existing query ID.
42
+
43
+ Attributes:
44
+ query_id: ID of saved query
45
+ annotation_id: Annotation ID of query
46
+ position: Optional (x, y, width, height) for manual layout
47
+ style: Display style (graph, table, combo)
48
+ visualization: Optional visualization settings dict
49
+ dataset: Optional dataset name
50
+ """
51
+
52
+ query_id: str
53
+ annotation_id: str
54
+ position: tuple[int, int, int, int] | None
55
+ style: Literal["graph", "table", "combo"]
56
+ visualization: dict[str, Any] | None
57
+ dataset: str | None
58
+
59
+
60
+ @dataclass
61
+ class SLOBuilderPanel:
62
+ """SLO panel from inline SLOBuilder (needs creation).
63
+
64
+ Attributes:
65
+ builder: SLOBuilder instance
66
+ position: Optional (x, y, width, height) for manual layout
67
+ """
68
+
69
+ builder: SLOBuilder
70
+ position: tuple[int, int, int, int] | None
71
+
72
+
73
+ @dataclass
74
+ class ExistingSLOPanel:
75
+ """SLO panel from existing SLO ID.
76
+
77
+ Attributes:
78
+ slo_id: ID of the SLO
79
+ position: Optional (x, y, width, height) for manual layout
80
+ """
81
+
82
+ slo_id: str
83
+ position: tuple[int, int, int, int] | None
84
+
85
+
86
+ @dataclass
87
+ class TextPanel:
88
+ """Text panel.
89
+
90
+ Attributes:
91
+ content: Markdown text content
92
+ position: Optional (x, y, width, height) for manual layout
93
+ """
94
+
95
+ content: str
96
+ position: tuple[int, int, int, int] | None
97
+
98
+
99
+ @dataclass
100
+ class BoardBundle:
101
+ """Board creation bundle for orchestration.
102
+
103
+ Returned by BoardBuilder.build(), consumed by boards.create_from_bundle_async().
104
+
105
+ Attributes:
106
+ board_name: Board name
107
+ board_description: Optional board description
108
+ layout_generation: Layout mode (auto or manual)
109
+ tags: Optional tags list
110
+ preset_filters: Optional preset filters list
111
+ query_builder_panels: Panels from QueryBuilder instances
112
+ existing_query_panels: Panels from existing query IDs
113
+ slo_panels: SLO panels
114
+ text_panels: Text panels
115
+ """
116
+
117
+ board_name: str
118
+ board_description: str | None
119
+ layout_generation: Literal["auto", "manual"]
120
+ tags: list[dict[str, str]] | None
121
+ preset_filters: list[dict[str, str]] | None
122
+ # Panels (in order added)
123
+ query_builder_panels: list[QueryBuilderPanel]
124
+ existing_query_panels: list[ExistingQueryPanel]
125
+ slo_builder_panels: list[SLOBuilderPanel]
126
+ existing_slo_panels: list[ExistingSLOPanel]
127
+ text_panels: list[TextPanel]
128
+
129
+
130
+ class BoardBuilder(TagsMixin):
131
+ """Fluent builder for boards with inline QueryBuilder or existing query IDs.
132
+
133
+ Example - Inline QueryBuilder with auto-layout:
134
+ board = await client.boards.create_from_bundle_async(
135
+ BoardBuilder("Service Dashboard")
136
+ .description("Overview of API health")
137
+ .auto_layout()
138
+ .query(
139
+ QueryBuilder("Request Count")
140
+ .dataset("api-logs")
141
+ .last_1_hour()
142
+ .count()
143
+ )
144
+ .slo("slo-id-1")
145
+ .text("## Notes\\nMonitor during peak hours")
146
+ .build()
147
+ )
148
+
149
+ Example - Manual layout with tuple positioning:
150
+ board = await client.boards.create_from_bundle_async(
151
+ BoardBuilder("Custom Layout")
152
+ .manual_layout()
153
+ .query(
154
+ QueryBuilder("Requests").dataset("api-logs").last_1_hour().count(),
155
+ position=(0, 0, 8, 6)
156
+ )
157
+ .slo("slo-id-1", position=(8, 0, 4, 6))
158
+ .build()
159
+ )
160
+ """
161
+
162
+ def __init__(self, name: str):
163
+ TagsMixin.__init__(self)
164
+ self._name = name
165
+ self._description: str | None = None
166
+ self._layout_generation: Literal["auto", "manual"] = "manual"
167
+ self._preset_filters: list[dict[str, str]] = []
168
+ # Panel storage (in order added)
169
+ self._query_builder_panels: list[QueryBuilderPanel] = []
170
+ self._existing_query_panels: list[ExistingQueryPanel] = []
171
+ self._slo_builder_panels: list[SLOBuilderPanel] = []
172
+ self._existing_slo_panels: list[ExistingSLOPanel] = []
173
+ self._text_panels: list[TextPanel] = []
174
+
175
+ def description(self, desc: str) -> BoardBuilder:
176
+ """Set board description (max 1024 chars).
177
+
178
+ Args:
179
+ desc: Description text
180
+ """
181
+ self._description = desc
182
+ return self
183
+
184
+ # -------------------------------------------------------------------------
185
+ # Layout configuration
186
+ # -------------------------------------------------------------------------
187
+
188
+ def auto_layout(self) -> BoardBuilder:
189
+ """Use automatic layout positioning.
190
+
191
+ Panels will be arranged automatically. Position can be omitted.
192
+ """
193
+ self._layout_generation = "auto"
194
+ return self
195
+
196
+ def manual_layout(self) -> BoardBuilder:
197
+ """Use manual layout positioning (default).
198
+
199
+ When using manual layout, you must specify position for all panels.
200
+ """
201
+ self._layout_generation = "manual"
202
+ return self
203
+
204
+ # -------------------------------------------------------------------------
205
+ # Preset filters
206
+ # -------------------------------------------------------------------------
207
+
208
+ def preset_filter(self, column: str, alias: str) -> BoardBuilder:
209
+ """Add a preset filter to the board.
210
+
211
+ Preset filters allow dynamic filtering of board data by specific columns.
212
+
213
+ Args:
214
+ column: Original column name to filter on
215
+ alias: Display name for the filter in the UI
216
+
217
+ Example:
218
+ .preset_filter("service_name", "Service")
219
+ .preset_filter("environment", "Environment")
220
+ """
221
+ self._preset_filters.append({"column": column, "alias": alias})
222
+ return self
223
+
224
+ # -------------------------------------------------------------------------
225
+ # Add panels
226
+ # -------------------------------------------------------------------------
227
+
228
+ def query(
229
+ self,
230
+ query: QueryBuilder | str,
231
+ annotation_id: str | None = None,
232
+ *,
233
+ position: tuple[int, int, int, int] | None = None,
234
+ style: Literal["graph", "table", "combo"] = "graph",
235
+ visualization: dict[str, Any] | None = None,
236
+ dataset: str | None = None,
237
+ ) -> BoardBuilder:
238
+ """Add a query panel.
239
+
240
+ Args:
241
+ query: QueryBuilder with .name() OR existing query_id string
242
+ annotation_id: Required only if query is string
243
+ position: (x, y, width, height) for manual layout
244
+ style: graph | table | combo
245
+ visualization: {"hide_markers": True, "utc_xaxis": True, ...}
246
+ dataset: Override QueryBuilder's dataset
247
+
248
+ Example - Inline QueryBuilder:
249
+ .query(
250
+ QueryBuilder("Request Count")
251
+ .dataset("api-logs")
252
+ .last_24_hours()
253
+ .count()
254
+ .group_by("service")
255
+ .description("Requests by service over 24h"),
256
+ position=(0, 0, 9, 6),
257
+ style="graph",
258
+ visualization={"hide_markers": True, "utc_xaxis": True}
259
+ )
260
+
261
+ Example - Existing query:
262
+ .query("query-id-123", "annotation-id-456", style="table")
263
+ """
264
+ from honeycomb.models.query_builder import QueryBuilder
265
+
266
+ if isinstance(query, QueryBuilder):
267
+ if not query.has_name():
268
+ raise ValueError("QueryBuilder must have name in constructor for board panels")
269
+
270
+ self._query_builder_panels.append(
271
+ QueryBuilderPanel(
272
+ builder=query,
273
+ position=position,
274
+ style=style,
275
+ visualization=visualization,
276
+ dataset_override=dataset,
277
+ )
278
+ )
279
+ else:
280
+ if not annotation_id:
281
+ raise ValueError("annotation_id required when using existing query ID")
282
+
283
+ self._existing_query_panels.append(
284
+ ExistingQueryPanel(
285
+ query_id=query,
286
+ annotation_id=annotation_id,
287
+ position=position,
288
+ style=style,
289
+ visualization=visualization,
290
+ dataset=dataset,
291
+ )
292
+ )
293
+ return self
294
+
295
+ def slo(
296
+ self,
297
+ slo: SLOBuilder | str,
298
+ *,
299
+ position: tuple[int, int, int, int] | None = None,
300
+ ) -> BoardBuilder:
301
+ """Add an SLO panel.
302
+
303
+ Args:
304
+ slo: SLOBuilder instance OR existing SLO ID string
305
+ position: (x, y, width, height) for manual layout
306
+
307
+ Example - Inline SLOBuilder:
308
+ .slo(
309
+ SLOBuilder("API Availability")
310
+ .dataset("api-logs")
311
+ .target_nines(3)
312
+ .sli(alias="success_rate"),
313
+ position=(9, 0, 3, 6)
314
+ )
315
+
316
+ Example - Existing SLO:
317
+ .slo("slo-id-123", position=(8, 0, 4, 6))
318
+ """
319
+ from honeycomb.models.slo_builder import SLOBuilder
320
+
321
+ if isinstance(slo, SLOBuilder):
322
+ self._slo_builder_panels.append(SLOBuilderPanel(builder=slo, position=position))
323
+ else:
324
+ self._existing_slo_panels.append(ExistingSLOPanel(slo_id=slo, position=position))
325
+ return self
326
+
327
+ def text(
328
+ self,
329
+ content: str,
330
+ *,
331
+ position: tuple[int, int, int, int] | None = None,
332
+ ) -> BoardBuilder:
333
+ """Add a text panel (supports markdown, max 10000 chars).
334
+
335
+ Args:
336
+ content: Markdown text content
337
+ position: (x, y, width, height) for manual layout
338
+
339
+ Example:
340
+ .text("## Service Status\\n\\nAll systems operational", position=(0, 6, 12, 2))
341
+ """
342
+ if len(content) > 10000:
343
+ raise ValueError(f"Text content must be <= 10000 characters, got {len(content)}")
344
+ self._text_panels.append(TextPanel(content=content, position=position))
345
+ return self
346
+
347
+ # -------------------------------------------------------------------------
348
+ # Build
349
+ # -------------------------------------------------------------------------
350
+
351
+ def build(self) -> BoardBundle:
352
+ """Build BoardBundle for orchestration.
353
+
354
+ Returns:
355
+ BoardBundle (not BoardCreate) for client orchestration
356
+
357
+ Raises:
358
+ ValueError: If manual layout requires positions but some are missing
359
+ """
360
+ # Validate manual layout requires all positions
361
+ if self._layout_generation == "manual":
362
+ all_panels = (
363
+ self._query_builder_panels
364
+ + self._existing_query_panels
365
+ + self._slo_builder_panels
366
+ + self._existing_slo_panels
367
+ + self._text_panels
368
+ )
369
+ for i, panel in enumerate(all_panels):
370
+ if panel.position is None:
371
+ raise ValueError(
372
+ f"Manual layout requires position for all panels. "
373
+ f"Panel {i} missing position. Use position=(x, y, width, height)"
374
+ )
375
+
376
+ return BoardBundle(
377
+ board_name=self._name,
378
+ board_description=self._description,
379
+ layout_generation=self._layout_generation,
380
+ tags=self._get_all_tags(),
381
+ preset_filters=self._preset_filters if self._preset_filters else None,
382
+ query_builder_panels=self._query_builder_panels,
383
+ existing_query_panels=self._existing_query_panels,
384
+ slo_builder_panels=self._slo_builder_panels,
385
+ existing_slo_panels=self._existing_slo_panels,
386
+ text_panels=self._text_panels,
387
+ )
@@ -0,0 +1,86 @@
1
+ """Pydantic models for Honeycomb Boards."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Literal
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class BoardCreate(BaseModel):
11
+ """Model for creating a new board.
12
+
13
+ The Honeycomb Board API only supports flexible boards.
14
+
15
+ Attributes:
16
+ name: Human-readable name (1-255 chars)
17
+ description: Longer description (0-1024 chars)
18
+ type: Board type (only "flexible" is supported)
19
+ panels: Array of board panels (queries, SLOs, text)
20
+ layout_generation: Layout mode - "auto" or "manual" (default: "manual")
21
+ tags: Array of tag objects (max 10 items)
22
+ preset_filters: Array of preset filter objects
23
+ """
24
+
25
+ name: str = Field(description="Human-readable name for the board (1-255 chars)")
26
+ description: str | None = Field(default=None, description="Longer description (0-1024 chars)")
27
+ type: str = Field(
28
+ default="flexible",
29
+ description="Board type: only 'flexible' is supported",
30
+ )
31
+ panels: list[dict[str, Any]] | None = Field(
32
+ default=None,
33
+ description="Array of board panels (queries, SLOs, text)",
34
+ )
35
+ layout_generation: Literal["auto", "manual"] = Field(
36
+ default="manual",
37
+ description="Layout mode: 'auto' or 'manual'",
38
+ )
39
+ tags: list[dict[str, str]] | None = Field(
40
+ default=None,
41
+ description="Array of tag objects (max 10)",
42
+ )
43
+ preset_filters: list[dict[str, str]] | None = Field(
44
+ default=None,
45
+ description="Array of preset filter objects",
46
+ )
47
+
48
+ def model_dump_for_api(self) -> dict[str, Any]:
49
+ """Serialize for API request."""
50
+ data: dict[str, Any] = {
51
+ "name": self.name,
52
+ "type": self.type,
53
+ "layout_generation": self.layout_generation,
54
+ }
55
+
56
+ if self.description:
57
+ data["description"] = self.description
58
+
59
+ if self.panels:
60
+ data["panels"] = self.panels
61
+
62
+ if self.tags:
63
+ data["tags"] = self.tags
64
+
65
+ if self.preset_filters:
66
+ data["preset_filters"] = self.preset_filters
67
+
68
+ return data
69
+
70
+
71
+ class Board(BaseModel):
72
+ """A Honeycomb board (response model)."""
73
+
74
+ id: str = Field(description="Unique identifier")
75
+ name: str = Field(description="Human-readable name")
76
+ description: str | None = Field(default=None, description="Longer description")
77
+ type: str = Field(default="flexible", description="Board type")
78
+ panels: list[dict] | None = Field(default=None, description="Board panels")
79
+ links: dict | None = Field(default=None, description="Board links")
80
+ layout_generation: str | None = Field(
81
+ default=None,
82
+ description="Layout mode: 'auto' or 'manual'",
83
+ )
84
+ tags: list[dict] | None = Field(default=None, description="Board tags")
85
+
86
+ model_config = {"extra": "allow"}
@@ -0,0 +1,124 @@
1
+ """Pydantic models for Honeycomb Burn Alerts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+ from typing import Any
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+
12
+ class BurnAlertType(str, Enum):
13
+ """Burn alert types."""
14
+
15
+ EXHAUSTION_TIME = "exhaustion_time"
16
+ BUDGET_RATE = "budget_rate"
17
+
18
+
19
+ class BurnAlertRecipient(BaseModel):
20
+ """A recipient for burn alert notifications.
21
+
22
+ Either id (recommended) OR type+target (deprecated) must be provided.
23
+ """
24
+
25
+ id: str | None = Field(default=None, description="ID of the recipient")
26
+ type: str | None = Field(default=None, description="Type of recipient (email, slack, etc)")
27
+ target: str | None = Field(default=None, description="Target address (for backwards compat)")
28
+ details: dict[str, Any] | None = Field(default=None, description="Additional details")
29
+
30
+
31
+ class BurnAlertCreate(BaseModel):
32
+ """Model for creating a new burn alert."""
33
+
34
+ alert_type: BurnAlertType = Field(description="Type of burn alert")
35
+ slo_id: str = Field(description="ID of the SLO to monitor")
36
+ description: str | None = Field(default=None, description="Description of the burn alert")
37
+ recipients: list[BurnAlertRecipient] = Field(
38
+ default_factory=list,
39
+ description="List of recipients to notify when alert fires",
40
+ )
41
+
42
+ # Exhaustion time fields (required when alert_type=exhaustion_time)
43
+ exhaustion_minutes: int | None = Field(
44
+ default=None,
45
+ description="Minutes until SLO budget exhaustion (for exhaustion_time alerts)",
46
+ )
47
+
48
+ # Budget rate fields (required when alert_type=budget_rate)
49
+ budget_rate_window_minutes: int | None = Field(
50
+ default=None, description="Time window in minutes (for budget_rate alerts)"
51
+ )
52
+ budget_rate_decrease_threshold_per_million: int | None = Field(
53
+ default=None,
54
+ description="Budget decrease threshold per million (for budget_rate alerts)",
55
+ )
56
+
57
+ def model_dump_for_api(self) -> dict[str, Any]:
58
+ """Serialize for API request."""
59
+ # Build recipient list - support both id-based and inline (type+target) formats
60
+ recipients_data = []
61
+ for r in self.recipients:
62
+ recipient_dict: dict[str, Any] = {}
63
+ if r.id:
64
+ # ID-based recipient (recommended)
65
+ recipient_dict["id"] = r.id
66
+ if r.type:
67
+ recipient_dict["type"] = r.type
68
+ else:
69
+ # Inline recipient (deprecated but still supported)
70
+ if r.type:
71
+ recipient_dict["type"] = r.type
72
+ if r.target:
73
+ recipient_dict["target"] = r.target
74
+ if r.details:
75
+ recipient_dict["details"] = r.details
76
+ recipients_data.append(recipient_dict)
77
+
78
+ data: dict[str, Any] = {
79
+ "alert_type": self.alert_type.value,
80
+ "slo": {"id": self.slo_id},
81
+ "recipients": recipients_data,
82
+ }
83
+
84
+ if self.description:
85
+ data["description"] = self.description
86
+
87
+ if self.alert_type == BurnAlertType.EXHAUSTION_TIME and self.exhaustion_minutes:
88
+ data["exhaustion_minutes"] = self.exhaustion_minutes
89
+ elif self.alert_type == BurnAlertType.BUDGET_RATE:
90
+ if self.budget_rate_window_minutes:
91
+ data["budget_rate_window_minutes"] = self.budget_rate_window_minutes
92
+ if self.budget_rate_decrease_threshold_per_million:
93
+ data["budget_rate_decrease_threshold_per_million"] = (
94
+ self.budget_rate_decrease_threshold_per_million
95
+ )
96
+
97
+ return data
98
+
99
+
100
+ class BurnAlert(BaseModel):
101
+ """A Honeycomb burn alert (response model)."""
102
+
103
+ id: str = Field(description="Unique identifier")
104
+ alert_type: BurnAlertType = Field(description="Type of burn alert")
105
+ slo_id: str | None = Field(default=None, description="ID of the associated SLO")
106
+ description: str | None = Field(default=None, description="Description of the burn alert")
107
+ triggered: bool = Field(default=False, description="Whether alert is currently triggered")
108
+
109
+ # Exhaustion time fields
110
+ exhaustion_minutes: int | None = Field(default=None, description="Minutes until exhaustion")
111
+
112
+ # Budget rate fields
113
+ budget_rate_window_minutes: int | None = Field(default=None, description="Time window")
114
+ budget_rate_decrease_threshold_per_million: int | None = Field(
115
+ default=None, description="Budget decrease threshold"
116
+ )
117
+
118
+ recipients: list[dict] | None = Field(default=None, description="List of recipients")
119
+ slo: dict | None = Field(default=None, description="SLO details")
120
+
121
+ created_at: datetime | None = Field(default=None, description="Creation timestamp")
122
+ updated_at: datetime | None = Field(default=None, description="Last update timestamp")
123
+
124
+ model_config = {"extra": "allow"}
@@ -0,0 +1,59 @@
1
+ """Pydantic models for Honeycomb Columns."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+
8
+ from pydantic import BaseModel, Field
9
+
10
+
11
+ class ColumnType(str, Enum):
12
+ """Column data types."""
13
+
14
+ STRING = "string"
15
+ INTEGER = "integer"
16
+ FLOAT = "float"
17
+ BOOLEAN = "boolean"
18
+
19
+
20
+ class ColumnCreate(BaseModel):
21
+ """Model for creating a new column."""
22
+
23
+ key_name: str = Field(description="Name of the column")
24
+ type: ColumnType = Field(
25
+ default=ColumnType.STRING, description="Type of data the column contains"
26
+ )
27
+ description: str | None = Field(default=None, description="Column description")
28
+ hidden: bool = Field(
29
+ default=False,
30
+ description="If true, column is excluded from autocomplete and raw data field lists",
31
+ )
32
+
33
+ def model_dump_for_api(self) -> dict:
34
+ """Serialize for API request."""
35
+ data = {
36
+ "key_name": self.key_name,
37
+ "type": self.type.value,
38
+ "hidden": self.hidden,
39
+ }
40
+ if self.description:
41
+ data["description"] = self.description
42
+ return data
43
+
44
+
45
+ class Column(BaseModel):
46
+ """A Honeycomb column (response model)."""
47
+
48
+ id: str = Field(description="Unique identifier")
49
+ key_name: str = Field(description="Name of the column")
50
+ type: ColumnType = Field(description="Type of data the column contains")
51
+ description: str | None = Field(default=None, description="Column description")
52
+ hidden: bool = Field(default=False, description="Whether column is hidden")
53
+ last_written: datetime | None = Field(
54
+ default=None, description="Timestamp when column was last written to"
55
+ )
56
+ created_at: datetime | None = Field(default=None, description="Creation timestamp")
57
+ updated_at: datetime | None = Field(default=None, description="Last update timestamp")
58
+
59
+ model_config = {"extra": "allow"}