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,512 @@
1
+ """Builder conversion helpers for Claude tool input.
2
+
3
+ This module converts tool input dictionaries (from Claude) to Builder instances,
4
+ enabling single-call resource creation with nested structures.
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ from honeycomb.models import (
10
+ BoardBuilder,
11
+ BurnAlertBuilder,
12
+ BurnAlertType,
13
+ SLOBuilder,
14
+ TriggerBuilder,
15
+ )
16
+
17
+
18
+ def _build_trigger(data: dict[str, Any]) -> TriggerBuilder:
19
+ """Convert tool input to TriggerBuilder.
20
+
21
+ Args:
22
+ data: Tool input dict from Claude (includes dataset, name, query, threshold, etc.)
23
+
24
+ Returns:
25
+ Configured TriggerBuilder instance ready to build()
26
+
27
+ Example:
28
+ >>> data = {
29
+ ... "dataset": "api-logs",
30
+ ... "name": "High Error Rate",
31
+ ... "query": {
32
+ ... "time_range": 900,
33
+ ... "calculations": [{"op": "COUNT"}],
34
+ ... "filters": [{"column": "status", "op": ">=", "value": 500}]
35
+ ... },
36
+ ... "threshold": {"op": ">", "value": 100},
37
+ ... "frequency": 900
38
+ ... }
39
+ >>> builder = _build_trigger(data)
40
+ >>> trigger = builder.build()
41
+ """
42
+ builder = TriggerBuilder(data["name"])
43
+
44
+ # Set description if provided
45
+ if "description" in data:
46
+ builder.description(data["description"])
47
+
48
+ # Set dataset if provided
49
+ if "dataset" in data:
50
+ builder.dataset(data["dataset"])
51
+
52
+ # Parse query
53
+ query = data.get("query", {})
54
+
55
+ # Time range
56
+ if "time_range" in query:
57
+ time_range = query["time_range"]
58
+ # Use preset if matches common values
59
+ if time_range == 600:
60
+ builder.last_10_minutes()
61
+ elif time_range == 1800:
62
+ builder.last_30_minutes()
63
+ elif time_range == 3600:
64
+ builder.last_1_hour()
65
+ else:
66
+ # Use generic time_range for non-standard values (including 900)
67
+ builder.time_range(time_range)
68
+
69
+ # Calculations (trigger supports only ONE)
70
+ calculations = query.get("calculations", [])
71
+ if calculations:
72
+ calc = calculations[0] # Only use first calculation
73
+ op = calc.get("op", "COUNT").upper()
74
+ column = calc.get("column")
75
+
76
+ if op == "COUNT":
77
+ builder.count()
78
+ elif op == "AVG" and column:
79
+ builder.avg(column)
80
+ elif op == "SUM" and column:
81
+ builder.sum(column)
82
+ elif op == "MAX" and column:
83
+ builder.max(column)
84
+ elif op == "MIN" and column:
85
+ builder.min(column)
86
+ elif op == "COUNT_DISTINCT" and column:
87
+ builder.count_distinct(column)
88
+ elif op == "HEATMAP" and column:
89
+ builder.heatmap(column)
90
+ elif op == "CONCURRENCY":
91
+ builder.concurrency()
92
+ elif op.startswith("P") and column:
93
+ # Percentile (e.g., P99, P95, P90, P50)
94
+ # Only P50, P90, P95, P99 are supported via direct methods
95
+ percentile = int(op[1:])
96
+ if percentile == 50:
97
+ builder.p50(column)
98
+ elif percentile == 90:
99
+ builder.p90(column)
100
+ elif percentile == 95:
101
+ builder.p95(column)
102
+ elif percentile == 99:
103
+ builder.p99(column)
104
+ # For other percentiles, would need to use generic calculation
105
+ # but trigger builder doesn't support that, so skip
106
+
107
+ # Filters
108
+ filters = query.get("filters", [])
109
+ for filt in filters:
110
+ column = filt["column"]
111
+ op_str = filt["op"]
112
+ value = filt.get("value")
113
+
114
+ # Use shorthand methods when possible for all filter types
115
+ if op_str == "=":
116
+ builder.eq(column, value)
117
+ elif op_str == "!=":
118
+ builder.ne(column, value)
119
+ elif op_str == ">":
120
+ builder.gt(column, value)
121
+ elif op_str == ">=":
122
+ builder.gte(column, value)
123
+ elif op_str == "<":
124
+ builder.lt(column, value)
125
+ elif op_str == "<=":
126
+ builder.lte(column, value)
127
+ elif op_str == "starts-with":
128
+ builder.starts_with(column, value)
129
+ elif op_str == "does-not-start-with":
130
+ # Use generic where() - no direct method for does-not-start-with
131
+ builder.where(column, op_str, value)
132
+ elif op_str == "contains":
133
+ builder.contains(column, value)
134
+ elif op_str == "does-not-contain":
135
+ # Use generic where() - no direct method for does-not-contain
136
+ builder.where(column, op_str, value)
137
+ elif op_str == "exists":
138
+ builder.exists(column)
139
+ elif op_str == "does-not-exist":
140
+ builder.does_not_exist(column)
141
+ elif op_str == "in":
142
+ builder.is_in(column, value)
143
+ elif op_str == "not-in":
144
+ # Use generic where() - no direct method for not-in
145
+ builder.where(column, op_str, value)
146
+ else:
147
+ # Use generic filter method for any other operators
148
+ builder.where(column, op_str, value)
149
+
150
+ # Filter combination
151
+ if "filter_combination" in query:
152
+ builder.filter_with(query["filter_combination"])
153
+
154
+ # Breakdowns (grouping)
155
+ if "breakdowns" in query:
156
+ for breakdown in query["breakdowns"]:
157
+ builder.breakdown(breakdown)
158
+
159
+ # Threshold
160
+ threshold = data["threshold"]
161
+ op = threshold["op"]
162
+ value = threshold["value"]
163
+
164
+ if op == ">":
165
+ builder.threshold_gt(value)
166
+ elif op == ">=":
167
+ builder.threshold_gte(value)
168
+ elif op == "<":
169
+ builder.threshold_lt(value)
170
+ elif op == "<=":
171
+ builder.threshold_lte(value)
172
+
173
+ # Exceeded limit
174
+ if "exceeded_limit" in threshold:
175
+ builder.exceeded_limit(threshold["exceeded_limit"])
176
+
177
+ # Frequency
178
+ if "frequency" in data:
179
+ freq = data["frequency"]
180
+ # Use presets when possible
181
+ if freq == 60:
182
+ builder.every_minute()
183
+ elif freq == 300:
184
+ builder.every_5_minutes()
185
+ elif freq == 900:
186
+ builder.every_15_minutes()
187
+ elif freq == 1800:
188
+ builder.every_30_minutes()
189
+ elif freq == 3600:
190
+ builder.every_hour()
191
+ else:
192
+ builder.frequency(freq)
193
+
194
+ # Alert type
195
+ if "alert_type" in data:
196
+ if data["alert_type"] == "on_change":
197
+ builder.alert_on_change()
198
+ elif data["alert_type"] == "on_true":
199
+ builder.alert_on_true()
200
+
201
+ # Recipients
202
+ recipients = data.get("recipients", [])
203
+ for recip in recipients:
204
+ if "id" in recip:
205
+ # ID-based recipient (recommended)
206
+ builder.recipient_id(recip["id"])
207
+ elif recip.get("type") == "email":
208
+ builder.email(recip["target"])
209
+ elif recip.get("type") == "slack":
210
+ builder.slack(recip["target"])
211
+ elif recip.get("type") == "pagerduty":
212
+ severity = recip.get("details", {}).get("severity", "critical")
213
+ builder.pagerduty(recip["target"], severity=severity)
214
+ elif recip.get("type") == "webhook":
215
+ name = recip.get("name", "Webhook")
216
+ secret = recip.get("details", {}).get("secret")
217
+ builder.webhook(recip["target"], name=name, secret=secret)
218
+ elif recip.get("type") in ("msteams", "msteams_workflow"):
219
+ builder.msteams(recip["target"])
220
+
221
+ # Tags
222
+ tags = data.get("tags", [])
223
+ for tag in tags:
224
+ builder.tag(tag["key"], tag["value"])
225
+
226
+ # Disabled flag
227
+ if data.get("disabled", False):
228
+ builder.disabled()
229
+
230
+ return builder
231
+
232
+
233
+ def _build_slo(data: dict[str, Any]) -> SLOBuilder:
234
+ """Convert tool input to SLOBuilder.
235
+
236
+ Args:
237
+ data: Tool input dict from Claude (includes dataset, name, sli, target, etc.)
238
+
239
+ Returns:
240
+ Configured SLOBuilder instance ready to build()
241
+
242
+ Example:
243
+ >>> data = {
244
+ ... "dataset": "api-logs",
245
+ ... "name": "API Availability",
246
+ ... "sli": {"alias": "success_rate"},
247
+ ... "target_per_million": 999000,
248
+ ... "time_period_days": 30
249
+ ... }
250
+ >>> builder = _build_slo(data)
251
+ >>> bundle = builder.build()
252
+ """
253
+ builder = SLOBuilder(data["name"])
254
+
255
+ # Description
256
+ if "description" in data:
257
+ builder.description(data["description"])
258
+
259
+ # Dataset(s)
260
+ if "dataset" in data:
261
+ builder.dataset(data["dataset"])
262
+ elif "datasets" in data:
263
+ builder.datasets(data["datasets"])
264
+
265
+ # SLI
266
+ sli = data["sli"]
267
+ alias = sli["alias"]
268
+
269
+ if "expression" in sli:
270
+ # New derived column
271
+ expression = sli["expression"]
272
+ description = sli.get("description")
273
+ builder.sli(alias, expression, description)
274
+ else:
275
+ # Existing derived column
276
+ builder.sli(alias)
277
+
278
+ # Target
279
+ if "target_per_million" in data:
280
+ builder.target_per_million(data["target_per_million"])
281
+ elif "target_percentage" in data:
282
+ builder.target_percentage(data["target_percentage"])
283
+ elif "target_nines" in data:
284
+ builder.target_nines(data["target_nines"])
285
+
286
+ # Time period
287
+ if "time_period_days" in data:
288
+ builder.time_period_days(data["time_period_days"])
289
+ elif "time_period_weeks" in data:
290
+ builder.time_period_weeks(data["time_period_weeks"])
291
+
292
+ # Burn alerts
293
+ burn_alerts = data.get("burn_alerts", [])
294
+ for alert_data in burn_alerts:
295
+ alert_type_str = alert_data["alert_type"]
296
+ alert_type = BurnAlertType(alert_type_str)
297
+
298
+ burn_builder = BurnAlertBuilder(alert_type)
299
+
300
+ if "description" in alert_data:
301
+ burn_builder.description(alert_data["description"])
302
+
303
+ if alert_type == BurnAlertType.EXHAUSTION_TIME:
304
+ burn_builder.exhaustion_minutes(alert_data["exhaustion_minutes"])
305
+ elif alert_type == BurnAlertType.BUDGET_RATE:
306
+ burn_builder.window_minutes(alert_data["budget_rate_window_minutes"])
307
+ # Convert from per_million to percent
308
+ threshold_per_million = alert_data["budget_rate_decrease_threshold_per_million"]
309
+ threshold_percent = threshold_per_million / 10000 # e.g., 10000 → 1%
310
+ burn_builder.threshold_percent(threshold_percent)
311
+
312
+ # Recipients for burn alert
313
+ recipients = alert_data.get("recipients", [])
314
+ for recip in recipients:
315
+ if "id" in recip:
316
+ burn_builder.recipient_id(recip["id"])
317
+ elif recip.get("type") == "email":
318
+ burn_builder.email(recip["target"])
319
+ elif recip.get("type") == "slack":
320
+ burn_builder.slack(recip["target"])
321
+ elif recip.get("type") == "pagerduty":
322
+ severity = recip.get("details", {}).get("severity", "critical")
323
+ burn_builder.pagerduty(recip["target"], severity=severity)
324
+ elif recip.get("type") == "webhook":
325
+ name = recip.get("name", "Webhook")
326
+ secret = recip.get("details", {}).get("secret")
327
+ burn_builder.webhook(recip["target"], name=name, secret=secret)
328
+ elif recip.get("type") in ("msteams", "msteams_workflow"):
329
+ burn_builder.msteams(recip["target"])
330
+
331
+ # Add burn alert using the appropriate method based on type
332
+ if alert_type == BurnAlertType.EXHAUSTION_TIME:
333
+ builder.exhaustion_alert(burn_builder)
334
+ elif alert_type == BurnAlertType.BUDGET_RATE:
335
+ builder.budget_rate_alert(burn_builder)
336
+
337
+ return builder
338
+
339
+
340
+ def _build_board(data: dict[str, Any]) -> BoardBuilder:
341
+ """Convert tool input to BoardBuilder with inline panel creation.
342
+
343
+ Args:
344
+ data: Tool input dict from Claude (includes name, inline_query_panels, etc.)
345
+
346
+ Returns:
347
+ Configured BoardBuilder instance ready to build()
348
+
349
+ Example:
350
+ >>> data = {
351
+ ... "name": "API Dashboard",
352
+ ... "layout_generation": "auto",
353
+ ... "inline_query_panels": [
354
+ ... {
355
+ ... "name": "Error Count",
356
+ ... "dataset": "api-logs",
357
+ ... "time_range": 3600,
358
+ ... "calculations": [{"op": "COUNT"}]
359
+ ... }
360
+ ... ],
361
+ ... "text_panels": [{"content": "## Notes"}]
362
+ ... }
363
+ >>> builder = _build_board(data)
364
+ >>> bundle = builder.build()
365
+ """
366
+ from honeycomb.models.query_builder import QueryBuilder
367
+
368
+ builder = BoardBuilder(data["name"])
369
+
370
+ # Description
371
+ if "description" in data:
372
+ builder.description(data["description"])
373
+
374
+ # Layout generation
375
+ layout = data.get("layout_generation", "auto")
376
+ if layout == "auto":
377
+ builder.auto_layout()
378
+ else:
379
+ builder.manual_layout()
380
+
381
+ # Inline query panels (create QueryBuilder instances)
382
+ for query_panel in data.get("inline_query_panels", []):
383
+ # Build QueryBuilder from panel data
384
+ qb = QueryBuilder(query_panel["name"])
385
+
386
+ if "description" in query_panel:
387
+ qb.description(query_panel["description"])
388
+
389
+ # Dataset - optional for environment-wide queries
390
+ if "dataset" in query_panel:
391
+ qb.dataset(query_panel["dataset"])
392
+ else:
393
+ qb.environment_wide() # Default to environment-wide
394
+
395
+ # Time range
396
+ if "time_range" in query_panel:
397
+ qb.time_range(query_panel["time_range"])
398
+
399
+ # Calculations - directly append to _calculations
400
+ from honeycomb.models.query_builder import Calculation
401
+
402
+ for calc in query_panel.get("calculations", []):
403
+ qb._calculations.append(Calculation(**calc))
404
+
405
+ # Filters
406
+ for filt in query_panel.get("filters", []):
407
+ qb.filter(filt["column"], filt["op"], filt.get("value"))
408
+
409
+ # Breakdowns
410
+ for breakdown in query_panel.get("breakdowns", []):
411
+ qb.group_by(breakdown)
412
+
413
+ # Orders
414
+ for order in query_panel.get("orders", []):
415
+ qb.order_by(
416
+ order.get("column", order.get("op", "COUNT")), order.get("order", "descending")
417
+ )
418
+
419
+ # Limit
420
+ if "limit" in query_panel:
421
+ qb.limit(query_panel["limit"])
422
+
423
+ # Add to board with position and style
424
+ builder.query(
425
+ qb,
426
+ position=tuple(query_panel["position"]) if "position" in query_panel else None,
427
+ style=query_panel.get("style", "graph"),
428
+ visualization=query_panel.get("visualization"),
429
+ )
430
+
431
+ # Text panels
432
+ for text_panel in data.get("text_panels", []):
433
+ content = text_panel["content"] if isinstance(text_panel, dict) else text_panel
434
+ position = text_panel.get("position") if isinstance(text_panel, dict) else None
435
+ builder.text(content, position=tuple(position) if position else None)
436
+
437
+ # Existing query panels (by ID)
438
+ for existing in data.get("existing_query_panels", []):
439
+ builder.query(
440
+ existing["query_id"],
441
+ existing["annotation_id"],
442
+ position=tuple(existing["position"]) if "position" in existing else None,
443
+ style=existing.get("style", "graph"),
444
+ )
445
+
446
+ # Inline SLO panels (create SLOBuilder instances)
447
+ for slo_panel in data.get("inline_slo_panels", []):
448
+ # Build SLOBuilder from panel data
449
+ from honeycomb.models import SLOBuilder
450
+
451
+ slo_builder = SLOBuilder(slo_panel["name"])
452
+
453
+ if "description" in slo_panel:
454
+ slo_builder.description(slo_panel["description"])
455
+
456
+ # Dataset
457
+ slo_builder.dataset(slo_panel["dataset"])
458
+
459
+ # SLI
460
+ sli = slo_panel["sli"]
461
+ alias = sli["alias"]
462
+ if "expression" in sli:
463
+ # Inline derived column
464
+ slo_builder.sli(alias, sli["expression"], sli.get("description"))
465
+ else:
466
+ # Existing derived column
467
+ slo_builder.sli(alias)
468
+
469
+ # Target
470
+ if "target_per_million" in slo_panel:
471
+ slo_builder.target_per_million(slo_panel["target_per_million"])
472
+ elif "target_percentage" in slo_panel:
473
+ slo_builder.target_percentage(slo_panel["target_percentage"])
474
+ elif "target_nines" in slo_panel:
475
+ slo_builder.target_nines(slo_panel["target_nines"])
476
+
477
+ # Time period
478
+ if "time_period_days" in slo_panel:
479
+ slo_builder.time_period_days(slo_panel["time_period_days"])
480
+ elif "time_period_weeks" in slo_panel:
481
+ slo_builder.time_period_weeks(slo_panel["time_period_weeks"])
482
+ else:
483
+ slo_builder.time_period_days(30) # Default
484
+
485
+ # Add to board
486
+ builder.slo(
487
+ slo_builder,
488
+ position=tuple(slo_panel["position"]) if "position" in slo_panel else None,
489
+ )
490
+
491
+ # Existing SLO panels (by ID)
492
+ for slo in data.get("slo_panels", []):
493
+ if isinstance(slo, dict) and "slo_id" in slo:
494
+ builder.slo(
495
+ slo["slo_id"],
496
+ position=tuple(slo["position"]) if "position" in slo else None,
497
+ )
498
+ else:
499
+ builder.slo(slo) # Just an ID string
500
+
501
+ # Tags
502
+ for tag in data.get("tags", []):
503
+ builder.tag(tag["key"], tag["value"])
504
+
505
+ return builder
506
+
507
+
508
+ __all__ = [
509
+ "_build_trigger",
510
+ "_build_slo",
511
+ "_build_board",
512
+ ]