honeycomb-api 0.1.0__py3-none-any.whl → 0.5.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. honeycomb/__init__.py +9 -0
  2. honeycomb/_generated/api/auth/get_auth.py +2 -5
  3. honeycomb/_generated/api/auth/get_v2_auth.py +2 -5
  4. honeycomb/_generated/api/boards/create_board.py +6 -5
  5. honeycomb/_generated/api/boards/create_board_view.py +14 -9
  6. honeycomb/_generated/api/boards/delete_board.py +2 -5
  7. honeycomb/_generated/api/boards/delete_board_view.py +2 -5
  8. honeycomb/_generated/api/boards/get_board.py +2 -5
  9. honeycomb/_generated/api/boards/get_board_view.py +2 -5
  10. honeycomb/_generated/api/boards/list_board_views.py +10 -9
  11. honeycomb/_generated/api/boards/list_boards.py +2 -5
  12. honeycomb/_generated/api/boards/update_board.py +10 -5
  13. honeycomb/_generated/api/boards/update_board_view.py +2 -5
  14. honeycomb/_generated/api/burn_alerts/create_burn_alert.py +6 -8
  15. honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +2 -5
  16. honeycomb/_generated/api/burn_alerts/get_burn_alert.py +2 -5
  17. honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +2 -5
  18. honeycomb/_generated/api/calculated_fields/create_calculated_field.py +2 -5
  19. honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +2 -5
  20. honeycomb/_generated/api/calculated_fields/get_calculated_field.py +2 -5
  21. honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +2 -8
  22. honeycomb/_generated/api/calculated_fields/update_calculated_field.py +2 -5
  23. honeycomb/_generated/api/columns/create_column.py +2 -5
  24. honeycomb/_generated/api/columns/delete_column.py +2 -5
  25. honeycomb/_generated/api/columns/get_column.py +2 -5
  26. honeycomb/_generated/api/columns/list_columns.py +2 -8
  27. honeycomb/_generated/api/columns/update_column.py +2 -5
  28. honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +2 -5
  29. honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +2 -5
  30. honeycomb/_generated/api/datasets/create_dataset.py +2 -5
  31. honeycomb/_generated/api/datasets/delete_dataset.py +2 -5
  32. honeycomb/_generated/api/datasets/get_dataset.py +2 -5
  33. honeycomb/_generated/api/datasets/list_datasets.py +2 -5
  34. honeycomb/_generated/api/datasets/update_dataset.py +2 -5
  35. honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +4 -6
  36. honeycomb/_generated/api/environments/create_environment.py +2 -5
  37. honeycomb/_generated/api/environments/delete_environment.py +2 -5
  38. honeycomb/_generated/api/environments/get_environment.py +2 -5
  39. honeycomb/_generated/api/environments/list_environments.py +2 -7
  40. honeycomb/_generated/api/environments/update_environment.py +2 -5
  41. honeycomb/_generated/api/events/create_event.py +2 -7
  42. honeycomb/_generated/api/events/create_events.py +7 -11
  43. honeycomb/_generated/api/key_management/create_api_key.py +2 -5
  44. honeycomb/_generated/api/key_management/delete_api_key.py +2 -5
  45. honeycomb/_generated/api/key_management/get_api_key.py +2 -5
  46. honeycomb/_generated/api/key_management/list_api_keys.py +2 -7
  47. honeycomb/_generated/api/key_management/update_api_key.py +2 -5
  48. honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +2 -5
  49. honeycomb/_generated/api/marker_settings/create_marker_setting.py +2 -5
  50. honeycomb/_generated/api/marker_settings/delete_marker_settings.py +2 -5
  51. honeycomb/_generated/api/marker_settings/list_marker_settings.py +2 -5
  52. honeycomb/_generated/api/marker_settings/update_marker_settings.py +2 -5
  53. honeycomb/_generated/api/markers/create_marker.py +2 -5
  54. honeycomb/_generated/api/markers/create_marker_v2.py +2 -5
  55. honeycomb/_generated/api/markers/delete_marker.py +2 -5
  56. honeycomb/_generated/api/markers/get_marker.py +2 -5
  57. honeycomb/_generated/api/markers/update_marker.py +2 -5
  58. honeycomb/_generated/api/markers/update_marker_v2.py +2 -5
  59. honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +4 -8
  60. honeycomb/_generated/api/pipelines/record_pipeline_usage.py +4 -6
  61. honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +6 -7
  62. honeycomb/_generated/api/queries/create_query.py +2 -5
  63. honeycomb/_generated/api/queries/get_query.py +2 -5
  64. honeycomb/_generated/api/query_annotations/create_query_annotation.py +2 -5
  65. honeycomb/_generated/api/query_annotations/delete_query_annotation.py +2 -5
  66. honeycomb/_generated/api/query_annotations/get_query_annotation.py +2 -5
  67. honeycomb/_generated/api/query_annotations/list_query_annotations.py +2 -7
  68. honeycomb/_generated/api/query_annotations/update_query_annotation.py +2 -5
  69. honeycomb/_generated/api/query_data/create_query_result.py +2 -5
  70. honeycomb/_generated/api/query_data/get_query_result.py +2 -5
  71. honeycomb/_generated/api/recipients/create_recipient.py +2 -6
  72. honeycomb/_generated/api/recipients/delete_recipient.py +2 -5
  73. honeycomb/_generated/api/recipients/get_recipient.py +2 -6
  74. honeycomb/_generated/api/recipients/list_recipients.py +2 -6
  75. honeycomb/_generated/api/recipients/update_recipient.py +2 -6
  76. honeycomb/_generated/api/reporting/get_slo_history.py +2 -5
  77. honeycomb/_generated/api/service_maps/create_map_dependency_request.py +6 -9
  78. honeycomb/_generated/api/service_maps/get_map_dependencies.py +2 -7
  79. honeycomb/_generated/api/sl_os/create_slo.py +2 -5
  80. honeycomb/_generated/api/sl_os/delete_slo.py +2 -5
  81. honeycomb/_generated/api/sl_os/get_slo.py +2 -8
  82. honeycomb/_generated/api/sl_os/list_slos.py +2 -5
  83. honeycomb/_generated/api/sl_os/update_slo.py +2 -5
  84. honeycomb/_generated/api/triggers/create_trigger.py +2 -6
  85. honeycomb/_generated/api/triggers/delete_trigger.py +2 -5
  86. honeycomb/_generated/api/triggers/get_trigger.py +2 -5
  87. honeycomb/_generated/api/triggers/list_triggers.py +2 -5
  88. honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +2 -5
  89. honeycomb/_generated/api/triggers/update_trigger.py +2 -5
  90. honeycomb/_generated/client.py +2 -5
  91. honeycomb/_generated/models/__init__.py +195 -88
  92. honeycomb/_generated/models/api_key_create_request.py +6 -5
  93. honeycomb/_generated/models/api_key_create_request_data.py +15 -11
  94. honeycomb/_generated/models/api_key_create_request_data_relationships.py +2 -3
  95. honeycomb/_generated/models/api_key_create_request_data_type.py +1 -0
  96. honeycomb/_generated/models/api_key_list_response.py +2 -5
  97. honeycomb/_generated/models/api_key_object.py +14 -14
  98. honeycomb/_generated/models/api_key_object_links.py +2 -9
  99. honeycomb/_generated/models/api_key_object_relationships.py +5 -9
  100. honeycomb/_generated/models/api_key_object_type.py +1 -0
  101. honeycomb/_generated/models/api_key_response.py +2 -3
  102. honeycomb/_generated/models/api_key_update_request.py +15 -17
  103. honeycomb/_generated/models/auth.py +2 -5
  104. honeycomb/_generated/models/auth_api_key_access.py +2 -9
  105. honeycomb/_generated/models/auth_environment.py +2 -9
  106. honeycomb/_generated/models/auth_team.py +2 -9
  107. honeycomb/_generated/models/auth_type.py +1 -0
  108. honeycomb/_generated/models/auth_v2_response.py +5 -8
  109. honeycomb/_generated/models/auth_v2_response_data.py +14 -11
  110. honeycomb/_generated/models/auth_v2_response_data_attributes.py +10 -9
  111. honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +1 -0
  112. honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +4 -12
  113. honeycomb/_generated/models/auth_v2_response_data_relationships.py +1 -7
  114. honeycomb/_generated/models/auth_v2_response_data_type.py +1 -0
  115. honeycomb/_generated/models/base_trigger.py +21 -18
  116. honeycomb/_generated/models/base_trigger_alert_type.py +1 -0
  117. honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +5 -9
  118. honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +1 -0
  119. honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +1 -0
  120. honeycomb/_generated/models/base_trigger_evaluation_schedule.py +8 -6
  121. honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +1 -0
  122. honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +4 -9
  123. honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +1 -0
  124. honeycomb/_generated/models/base_trigger_threshold.py +2 -9
  125. honeycomb/_generated/models/base_trigger_threshold_op.py +1 -0
  126. honeycomb/_generated/models/batch_event.py +2 -5
  127. honeycomb/_generated/models/board.py +15 -17
  128. honeycomb/_generated/models/board_layout_generation.py +1 -0
  129. honeycomb/_generated/models/board_links.py +2 -9
  130. honeycomb/_generated/models/board_panel_position.py +2 -9
  131. honeycomb/_generated/models/board_query_visualization_settings.py +8 -8
  132. honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +4 -10
  133. honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +1 -0
  134. honeycomb/_generated/models/board_type.py +1 -0
  135. honeycomb/_generated/models/board_view_filter.py +2 -9
  136. honeycomb/_generated/models/board_view_filter_operation.py +1 -0
  137. honeycomb/_generated/models/board_view_response.py +2 -5
  138. honeycomb/_generated/models/budget_rate.py +4 -12
  139. honeycomb/_generated/models/budget_rate_alert_type.py +1 -0
  140. honeycomb/_generated/models/burn_alert_shared_params.py +4 -12
  141. honeycomb/_generated/models/calculated_field.py +2 -9
  142. honeycomb/_generated/models/configuration_key_attributes.py +16 -12
  143. honeycomb/_generated/models/configuration_key_attributes_key_type.py +1 -0
  144. honeycomb/_generated/models/configuration_key_attributes_permissions.py +172 -0
  145. honeycomb/_generated/models/configuration_key_attributes_timestamps.py +4 -12
  146. honeycomb/_generated/models/configuration_key_request.py +101 -0
  147. honeycomb/_generated/models/configuration_key_request_attributes.py +107 -0
  148. honeycomb/_generated/models/configuration_key_request_attributes_permissions.py +168 -0
  149. honeycomb/_generated/models/configuration_key_request_type.py +8 -0
  150. honeycomb/_generated/models/create_board_view_request.py +2 -3
  151. honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +10 -10
  152. honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +1 -7
  153. honeycomb/_generated/models/create_column.py +2 -9
  154. honeycomb/_generated/models/create_column_type.py +1 -0
  155. honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +8 -6
  156. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +10 -7
  157. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +8 -8
  158. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +8 -6
  159. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  160. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  161. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  162. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  163. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  164. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  165. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +8 -6
  166. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +2 -9
  167. honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +1 -0
  168. honeycomb/_generated/models/create_environment_request.py +8 -6
  169. honeycomb/_generated/models/create_environment_request_data.py +10 -7
  170. honeycomb/_generated/models/create_environment_request_data_attributes.py +2 -9
  171. honeycomb/_generated/models/create_environment_request_data_type.py +1 -0
  172. honeycomb/_generated/models/create_events_content_encoding.py +1 -0
  173. honeycomb/_generated/models/create_events_response_200_item.py +2 -9
  174. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +10 -10
  175. honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +1 -7
  176. honeycomb/_generated/models/create_map_dependencies_request.py +2 -5
  177. honeycomb/_generated/models/create_map_dependencies_response.py +4 -10
  178. honeycomb/_generated/models/create_map_dependencies_response_status.py +1 -0
  179. honeycomb/_generated/models/create_pipeline_health_record_request.py +8 -6
  180. honeycomb/_generated/models/create_pipeline_health_record_request_data.py +10 -7
  181. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +8 -8
  182. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +8 -6
  183. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
  184. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
  185. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
  186. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
  187. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_aggregation_temporality.py +1 -0
  188. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item.py +8 -6
  189. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item.py +8 -6
  190. honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum_datapoints_item_attributes_item_value.py +2 -9
  191. honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +1 -0
  192. honeycomb/_generated/models/create_query_result_request.py +2 -9
  193. honeycomb/_generated/models/dataset.py +2 -6
  194. honeycomb/_generated/models/dataset_creation_payload.py +2 -9
  195. honeycomb/_generated/models/dataset_definition_type_1.py +4 -10
  196. honeycomb/_generated/models/dataset_definition_type_1_column_type.py +1 -0
  197. honeycomb/_generated/models/dataset_definitions.py +2 -6
  198. honeycomb/_generated/models/dataset_relationship.py +2 -3
  199. honeycomb/_generated/models/dataset_relationship_data.py +2 -8
  200. honeycomb/_generated/models/dataset_relationship_data_type.py +1 -0
  201. honeycomb/_generated/models/dataset_settings.py +2 -9
  202. honeycomb/_generated/models/dataset_update_payload.py +8 -8
  203. honeycomb/_generated/models/dataset_update_payload_settings.py +2 -9
  204. honeycomb/_generated/models/detailed_error.py +2 -9
  205. honeycomb/_generated/models/email_recipient.py +4 -7
  206. honeycomb/_generated/models/email_recipient_details.py +1 -7
  207. honeycomb/_generated/models/email_recipient_type.py +1 -0
  208. honeycomb/_generated/models/environment.py +6 -7
  209. honeycomb/_generated/models/environment_attributes.py +11 -9
  210. honeycomb/_generated/models/environment_attributes_color_type_1.py +1 -0
  211. honeycomb/_generated/models/environment_attributes_settings.py +1 -7
  212. honeycomb/_generated/models/environment_color.py +1 -0
  213. honeycomb/_generated/models/environment_links.py +1 -7
  214. honeycomb/_generated/models/environment_list_response.py +2 -5
  215. honeycomb/_generated/models/environment_relationship.py +8 -6
  216. honeycomb/_generated/models/environment_relationship_data.py +3 -8
  217. honeycomb/_generated/models/environment_relationship_data_type.py +1 -0
  218. honeycomb/_generated/models/environment_response.py +2 -3
  219. honeycomb/_generated/models/environment_type.py +1 -0
  220. honeycomb/_generated/models/error.py +2 -9
  221. honeycomb/_generated/models/event.py +2 -8
  222. honeycomb/_generated/models/exhaustion_time.py +4 -12
  223. honeycomb/_generated/models/exhaustion_time_alert_type.py +1 -0
  224. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +10 -10
  225. honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +2 -9
  226. honeycomb/_generated/models/filter_op.py +1 -0
  227. honeycomb/_generated/models/get_map_dependencies_response.py +7 -10
  228. honeycomb/_generated/models/get_map_dependencies_response_status.py +1 -0
  229. honeycomb/_generated/models/having_calculate_op.py +1 -0
  230. honeycomb/_generated/models/having_op.py +1 -0
  231. honeycomb/_generated/models/included_resource.py +6 -7
  232. honeycomb/_generated/models/included_resource_attributes.py +1 -7
  233. honeycomb/_generated/models/ingest_key_attributes.py +14 -11
  234. honeycomb/_generated/models/ingest_key_attributes_key_type.py +1 -0
  235. honeycomb/_generated/models/ingest_key_attributes_permissions.py +2 -9
  236. honeycomb/_generated/models/ingest_key_attributes_timestamps.py +4 -12
  237. honeycomb/_generated/models/ingest_key_request.py +100 -0
  238. honeycomb/_generated/models/ingest_key_request_attributes.py +75 -0
  239. honeycomb/_generated/models/ingest_key_request_type.py +8 -0
  240. honeycomb/_generated/models/ingest_key_type.py +2 -9
  241. honeycomb/_generated/models/ingest_key_type_key_type.py +1 -0
  242. honeycomb/_generated/models/jsonapi_error_source.py +2 -9
  243. honeycomb/_generated/models/kinesis_event.py +2 -5
  244. honeycomb/_generated/models/kinesis_event_record.py +2 -9
  245. honeycomb/_generated/models/kinesis_response.py +2 -9
  246. honeycomb/_generated/models/list_api_keys_filtertype.py +1 -0
  247. honeycomb/_generated/models/map_dependency.py +2 -5
  248. honeycomb/_generated/models/map_node.py +2 -9
  249. honeycomb/_generated/models/map_node_type.py +1 -0
  250. honeycomb/_generated/models/marker.py +2 -9
  251. honeycomb/_generated/models/marker_create_request.py +2 -3
  252. honeycomb/_generated/models/marker_create_request_data.py +16 -10
  253. honeycomb/_generated/models/marker_create_request_data_attributes.py +2 -9
  254. honeycomb/_generated/models/marker_create_request_data_relationships.py +2 -3
  255. honeycomb/_generated/models/marker_create_request_data_type.py +1 -0
  256. honeycomb/_generated/models/marker_object.py +7 -8
  257. honeycomb/_generated/models/marker_object_attributes.py +8 -8
  258. honeycomb/_generated/models/marker_object_attributes_timestamps.py +4 -12
  259. honeycomb/_generated/models/marker_object_links.py +2 -9
  260. honeycomb/_generated/models/marker_object_relationships.py +8 -8
  261. honeycomb/_generated/models/marker_object_relationships_dataset.py +8 -9
  262. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +4 -10
  263. honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +1 -0
  264. honeycomb/_generated/models/marker_object_type.py +1 -0
  265. honeycomb/_generated/models/marker_response.py +2 -3
  266. honeycomb/_generated/models/marker_setting.py +2 -10
  267. honeycomb/_generated/models/marker_update_request.py +2 -3
  268. honeycomb/_generated/models/marker_update_request_data.py +16 -10
  269. honeycomb/_generated/models/marker_update_request_data_attributes.py +2 -9
  270. honeycomb/_generated/models/marker_update_request_data_relationships.py +2 -3
  271. honeycomb/_generated/models/marker_update_request_data_type.py +1 -0
  272. honeycomb/_generated/models/ms_teams_recipient.py +4 -7
  273. honeycomb/_generated/models/ms_teams_recipient_details.py +1 -7
  274. honeycomb/_generated/models/ms_teams_recipient_type.py +1 -0
  275. honeycomb/_generated/models/ms_teams_workflow_recipient.py +12 -11
  276. honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +1 -7
  277. honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +1 -0
  278. honeycomb/_generated/models/notification_recipient.py +8 -8
  279. honeycomb/_generated/models/notification_recipient_details.py +10 -9
  280. honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +1 -0
  281. honeycomb/_generated/models/notification_recipient_details_variables_item.py +2 -9
  282. honeycomb/_generated/models/pager_duty_recipient.py +8 -9
  283. honeycomb/_generated/models/pager_duty_recipient_details.py +1 -7
  284. honeycomb/_generated/models/pager_duty_recipient_type.py +1 -0
  285. honeycomb/_generated/models/pagination_links.py +2 -8
  286. honeycomb/_generated/models/payload_template.py +2 -9
  287. honeycomb/_generated/models/pipeline_configuration_response.py +16 -10
  288. honeycomb/_generated/models/pipeline_configuration_response_attributes.py +8 -8
  289. honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +1 -7
  290. honeycomb/_generated/models/pipeline_configuration_response_links.py +2 -9
  291. honeycomb/_generated/models/pipeline_configuration_response_type.py +1 -0
  292. honeycomb/_generated/models/pipeline_configuration_rollout.py +16 -10
  293. honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +3 -8
  294. honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +1 -0
  295. honeycomb/_generated/models/pipeline_configuration_rollout_links.py +2 -9
  296. honeycomb/_generated/models/pipeline_configuration_rollout_type.py +1 -0
  297. honeycomb/_generated/models/preset_filter.py +1 -7
  298. honeycomb/_generated/models/query.py +11 -11
  299. honeycomb/_generated/models/query_annotation.py +4 -12
  300. honeycomb/_generated/models/query_annotation_source.py +1 -0
  301. honeycomb/_generated/models/query_calculated_fields_item.py +1 -7
  302. honeycomb/_generated/models/query_calculations_item.py +2 -10
  303. honeycomb/_generated/models/query_compare_time_offset_seconds.py +1 -0
  304. honeycomb/_generated/models/query_filter_combination.py +1 -0
  305. honeycomb/_generated/models/query_filters_item.py +2 -11
  306. honeycomb/_generated/models/query_havings_item.py +2 -10
  307. honeycomb/_generated/models/query_op.py +1 -0
  308. honeycomb/_generated/models/query_orders_item.py +2 -9
  309. honeycomb/_generated/models/query_orders_item_order.py +1 -0
  310. honeycomb/_generated/models/query_panel.py +2 -6
  311. honeycomb/_generated/models/query_panel_query_panel.py +10 -9
  312. honeycomb/_generated/models/query_panel_query_panel_query_style.py +1 -0
  313. honeycomb/_generated/models/query_result.py +2 -5
  314. honeycomb/_generated/models/query_result_details.py +5 -8
  315. honeycomb/_generated/models/query_result_details_data.py +5 -8
  316. honeycomb/_generated/models/query_result_details_links.py +2 -9
  317. honeycomb/_generated/models/query_result_links.py +2 -9
  318. honeycomb/_generated/models/query_results_data.py +2 -5
  319. honeycomb/_generated/models/query_results_data_data.py +2 -8
  320. honeycomb/_generated/models/query_results_series.py +2 -5
  321. honeycomb/_generated/models/recipient_properties.py +4 -12
  322. honeycomb/_generated/models/recipient_type.py +1 -0
  323. honeycomb/_generated/models/slack_recipient.py +4 -7
  324. honeycomb/_generated/models/slack_recipient_details.py +1 -7
  325. honeycomb/_generated/models/slack_recipient_type.py +1 -0
  326. honeycomb/_generated/models/slo.py +4 -8
  327. honeycomb/_generated/models/slo_create.py +4 -8
  328. honeycomb/_generated/models/slo_create_sli.py +1 -7
  329. honeycomb/_generated/models/slo_detailed_response.py +4 -8
  330. honeycomb/_generated/models/slo_detailed_response_status.py +1 -0
  331. honeycomb/_generated/models/slo_history.py +2 -9
  332. honeycomb/_generated/models/slo_history_request.py +2 -8
  333. honeycomb/_generated/models/slo_history_response.py +2 -3
  334. honeycomb/_generated/models/slo_panel.py +2 -6
  335. honeycomb/_generated/models/slo_panel_slo_panel.py +2 -9
  336. honeycomb/_generated/models/slo_sli.py +1 -7
  337. honeycomb/_generated/models/tag.py +1 -7
  338. honeycomb/_generated/models/team_relationship.py +2 -3
  339. honeycomb/_generated/models/team_relationship_team.py +6 -5
  340. honeycomb/_generated/models/team_relationship_team_data.py +3 -8
  341. honeycomb/_generated/models/team_relationship_team_data_type.py +1 -0
  342. honeycomb/_generated/models/template_variable_definition.py +2 -9
  343. honeycomb/_generated/models/text_panel.py +2 -6
  344. honeycomb/_generated/models/text_panel_text_panel.py +1 -7
  345. honeycomb/_generated/models/trigger_response.py +27 -21
  346. honeycomb/_generated/models/trigger_with_inline_query.py +27 -21
  347. honeycomb/_generated/models/trigger_with_inline_query_query.py +1 -7
  348. honeycomb/_generated/models/trigger_with_query_reference.py +21 -18
  349. honeycomb/_generated/models/update_board_view_request.py +2 -5
  350. honeycomb/_generated/models/update_environment_request.py +8 -6
  351. honeycomb/_generated/models/update_environment_request_data.py +10 -7
  352. honeycomb/_generated/models/update_environment_request_data_attributes.py +8 -8
  353. honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +2 -9
  354. honeycomb/_generated/models/update_environment_request_data_type.py +1 -0
  355. honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +4 -7
  356. honeycomb/_generated/models/update_pipeline_configuration_rollout.py +10 -7
  357. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +3 -8
  358. honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +1 -0
  359. honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +8 -6
  360. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +10 -7
  361. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +3 -8
  362. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +1 -0
  363. honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +1 -0
  364. honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +8 -6
  365. honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +1 -0
  366. honeycomb/_generated/models/user_relationship.py +2 -3
  367. honeycomb/_generated/models/user_relationship_data.py +2 -8
  368. honeycomb/_generated/models/user_relationship_data_type.py +1 -0
  369. honeycomb/_generated/models/validation_error.py +8 -8
  370. honeycomb/_generated/models/validation_error_type_detail_item.py +4 -10
  371. honeycomb/_generated/models/validation_error_type_detail_item_code.py +1 -0
  372. honeycomb/_generated/models/webhook_header.py +2 -9
  373. honeycomb/_generated/models/webhook_recipient.py +4 -7
  374. honeycomb/_generated/models/webhook_recipient_details.py +8 -8
  375. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +12 -10
  376. honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +2 -5
  377. honeycomb/_generated/models/webhook_recipient_type.py +1 -0
  378. honeycomb/_generated/types.py +1 -1
  379. honeycomb/cli/__init__.py +85 -0
  380. honeycomb/cli/api_keys.py +205 -0
  381. honeycomb/cli/auth.py +70 -0
  382. honeycomb/cli/boards.py +203 -0
  383. honeycomb/cli/columns.py +256 -0
  384. honeycomb/cli/config.py +259 -0
  385. honeycomb/cli/datasets.py +186 -0
  386. honeycomb/cli/derived_columns.py +222 -0
  387. honeycomb/cli/environments.py +240 -0
  388. honeycomb/cli/formatters.py +242 -0
  389. honeycomb/cli/markers.py +151 -0
  390. honeycomb/cli/queries.py +380 -0
  391. honeycomb/cli/recipients.py +211 -0
  392. honeycomb/cli/slos.py +338 -0
  393. honeycomb/cli/triggers.py +271 -0
  394. honeycomb/client.py +13 -7
  395. honeycomb/models/__init__.py +18 -3
  396. honeycomb/models/api_keys.py +49 -5
  397. honeycomb/models/auth.py +71 -0
  398. honeycomb/models/board_builder.py +97 -25
  399. honeycomb/models/boards.py +95 -1
  400. honeycomb/models/datasets.py +42 -0
  401. honeycomb/models/queries.py +21 -0
  402. honeycomb/models/query_builder.py +119 -59
  403. honeycomb/models/recipient_builder.py +51 -4
  404. honeycomb/models/slo_builder.py +24 -19
  405. honeycomb/models/slos.py +50 -3
  406. honeycomb/models/tool_inputs.py +630 -0
  407. honeycomb/models/triggers.py +39 -9
  408. honeycomb/resources/__init__.py +2 -0
  409. honeycomb/resources/api_keys.py +66 -29
  410. honeycomb/resources/auth.py +97 -0
  411. honeycomb/resources/boards.py +272 -18
  412. honeycomb/resources/datasets.py +49 -11
  413. honeycomb/resources/environments.py +54 -31
  414. honeycomb/resources/slos.py +87 -61
  415. honeycomb/tools/__main__.py +40 -4
  416. honeycomb/tools/builders.py +235 -150
  417. honeycomb/tools/descriptions.py +175 -7
  418. honeycomb/tools/executor.py +212 -25
  419. honeycomb/tools/generator.py +61 -2264
  420. honeycomb/tools/resources/__init__.py +42 -0
  421. honeycomb/tools/resources/api_keys.py +249 -0
  422. honeycomb/tools/resources/auth.py +98 -0
  423. honeycomb/tools/resources/boards.py +313 -0
  424. honeycomb/tools/resources/burn_alerts.py +278 -0
  425. honeycomb/tools/resources/columns.py +257 -0
  426. honeycomb/tools/resources/datasets.py +215 -0
  427. honeycomb/tools/resources/derived_columns.py +311 -0
  428. honeycomb/tools/resources/environments.py +211 -0
  429. honeycomb/tools/resources/events.py +158 -0
  430. honeycomb/tools/resources/marker_settings.py +216 -0
  431. honeycomb/tools/resources/markers.py +197 -0
  432. honeycomb/tools/resources/queries.py +220 -0
  433. honeycomb/tools/resources/recipients.py +297 -0
  434. honeycomb/tools/resources/service_map.py +110 -0
  435. honeycomb/tools/resources/slos.py +276 -0
  436. honeycomb/tools/resources/triggers.py +328 -0
  437. honeycomb/tools/schemas.py +81 -0
  438. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/METADATA +33 -8
  439. honeycomb_api-0.5.3.dist-info/RECORD +497 -0
  440. honeycomb_api-0.5.3.dist-info/entry_points.txt +5 -0
  441. honeycomb_api-0.1.0.dist-info/RECORD +0 -453
  442. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/WHEEL +0 -0
  443. {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,380 @@
1
+ """
2
+ Query management and execution commands.
3
+ """
4
+
5
+ import json
6
+ from pathlib import Path
7
+
8
+ import typer
9
+ from rich.console import Console
10
+
11
+ from honeycomb.cli.config import get_client
12
+ from honeycomb.cli.formatters import DEFAULT_OUTPUT_FORMAT, OutputFormat, output_result
13
+ from honeycomb.models.queries import QuerySpec
14
+ from honeycomb.models.query_builder import QueryBuilder
15
+
16
+ app = typer.Typer(help="Manage and run queries")
17
+ console = Console()
18
+
19
+
20
+ @app.command("list")
21
+ def list_queries(
22
+ dataset: str = typer.Option(
23
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__ for environment-wide)"
24
+ ),
25
+ include_board_annotations: bool = typer.Option(
26
+ False, "--include-boards", help="Include board queries"
27
+ ),
28
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
29
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
30
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
31
+ quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output query IDs"),
32
+ ) -> None:
33
+ """List all query annotations (saved queries) in a dataset."""
34
+ try:
35
+ client = get_client(profile=profile, api_key=api_key)
36
+ annotations = client.query_annotations.list(
37
+ dataset=dataset, include_board_annotations=include_board_annotations
38
+ )
39
+ output_result(
40
+ annotations,
41
+ output,
42
+ columns=["id", "name", "description"],
43
+ quiet=quiet,
44
+ )
45
+ except Exception as e:
46
+ console.print(f"[red]Error:[/red] {e}", style="bold")
47
+ raise typer.Exit(1)
48
+
49
+
50
+ @app.command("get")
51
+ def get_query(
52
+ query_id: str = typer.Argument(..., help="Query ID"),
53
+ dataset: str = typer.Option(
54
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
55
+ ),
56
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
57
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
58
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
59
+ ) -> None:
60
+ """Get a specific query."""
61
+ try:
62
+ client = get_client(profile=profile, api_key=api_key)
63
+ query = client.queries.get(dataset=dataset, query_id=query_id)
64
+ output_result(query, output)
65
+ except Exception as e:
66
+ console.print(f"[red]Error:[/red] {e}", style="bold")
67
+ raise typer.Exit(1)
68
+
69
+
70
+ @app.command("create")
71
+ def create_query(
72
+ dataset: str = typer.Option(
73
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
74
+ ),
75
+ from_file: Path = typer.Option(..., "--from-file", "-f", help="JSON file with query spec"),
76
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
77
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
78
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
79
+ ) -> None:
80
+ """Create (save) a query from a JSON file."""
81
+ try:
82
+ client = get_client(profile=profile, api_key=api_key)
83
+
84
+ # Load and parse JSON file
85
+ data = json.loads(from_file.read_text())
86
+
87
+ query_spec = QuerySpec.model_validate(data)
88
+ query = client.queries.create(dataset=dataset, spec=query_spec)
89
+
90
+ console.print(f"[green]Created query with ID: {query.id}[/green]")
91
+ output_result(query, output)
92
+ except Exception as e:
93
+ console.print(f"[red]Error:[/red] {e}", style="bold")
94
+ raise typer.Exit(1)
95
+
96
+
97
+ @app.command("run")
98
+ def run_query(
99
+ # Dataset
100
+ dataset: str = typer.Option(
101
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
102
+ ),
103
+ # Input methods (mutually exclusive with builder flags)
104
+ from_file: Path | None = typer.Option(
105
+ None, "--from-file", "-f", help="JSON file with query spec"
106
+ ),
107
+ spec: str | None = typer.Option(None, "--spec", "-s", help="Inline JSON query spec"),
108
+ query_id: str | None = typer.Option(None, "--query-id", help="Run an existing saved query"),
109
+ # QueryBuilder flags - Calculations
110
+ count: bool = typer.Option(False, "--count", help="Add COUNT calculation"),
111
+ avg: list[str] = typer.Option([], "--avg", help="Add AVG calculation for column (repeatable)"),
112
+ sum_cols: list[str] = typer.Option(
113
+ [], "--sum", help="Add SUM calculation for column (repeatable)"
114
+ ),
115
+ min_calc: list[str] = typer.Option(
116
+ [], "--min", help="Add MIN calculation for column (repeatable)"
117
+ ),
118
+ max_calc: list[str] = typer.Option(
119
+ [], "--max", help="Add MAX calculation for column (repeatable)"
120
+ ),
121
+ p50: list[str] = typer.Option([], "--p50", help="Add P50 calculation for column (repeatable)"),
122
+ p90: list[str] = typer.Option([], "--p90", help="Add P90 calculation for column (repeatable)"),
123
+ p95: list[str] = typer.Option([], "--p95", help="Add P95 calculation for column (repeatable)"),
124
+ p99: list[str] = typer.Option([], "--p99", help="Add P99 calculation for column (repeatable)"),
125
+ # Time ranges
126
+ time_range: int | None = typer.Option(None, "--time-range", help="Time range in seconds"),
127
+ last_10_minutes: bool = typer.Option(False, "--last-10-minutes", help="Last 10 minutes"),
128
+ last_30_minutes: bool = typer.Option(False, "--last-30-minutes", help="Last 30 minutes"),
129
+ last_1_hour: bool = typer.Option(False, "--last-1-hour", help="Last 1 hour"),
130
+ last_2_hours: bool = typer.Option(False, "--last-2-hours", help="Last 2 hours"),
131
+ last_8_hours: bool = typer.Option(False, "--last-8-hours", help="Last 8 hours"),
132
+ last_24_hours: bool = typer.Option(False, "--last-24-hours", help="Last 24 hours"),
133
+ last_7_days: bool = typer.Option(False, "--last-7-days", help="Last 7 days"),
134
+ # Filters (comma-separated: column,value)
135
+ where_equals: list[str] = typer.Option(
136
+ [], "--where-equals", help="Filter: column=value (format: col,val)"
137
+ ),
138
+ where_ne: list[str] = typer.Option(
139
+ [], "--where-ne", help="Filter: column!=value (format: col,val)"
140
+ ),
141
+ where_gt: list[str] = typer.Option(
142
+ [], "--where-gt", help="Filter: column>value (format: col,val)"
143
+ ),
144
+ where_gte: list[str] = typer.Option(
145
+ [], "--where-gte", help="Filter: column>=value (format: col,val)"
146
+ ),
147
+ where_lt: list[str] = typer.Option(
148
+ [], "--where-lt", help="Filter: column<value (format: col,val)"
149
+ ),
150
+ where_lte: list[str] = typer.Option(
151
+ [], "--where-lte", help="Filter: column<=value (format: col,val)"
152
+ ),
153
+ where_contains: list[str] = typer.Option(
154
+ [], "--where-contains", help="Filter: column contains value (format: col,val)"
155
+ ),
156
+ where_exists: list[str] = typer.Option(
157
+ [], "--where-exists", help="Filter: column exists (just column name)"
158
+ ),
159
+ # Grouping and ordering
160
+ group_by: list[str] = typer.Option([], "--group-by", help="Group by column (repeatable)"),
161
+ order_by: str | None = typer.Option(None, "--order-by", help="Order by field"),
162
+ limit_rows: int | None = typer.Option(None, "--limit", help="Limit results"),
163
+ # Query execution
164
+ poll_interval: float = typer.Option(1.0, "--poll-interval", help="Polling interval in seconds"),
165
+ timeout: float = typer.Option(60.0, "--timeout", help="Timeout in seconds"),
166
+ # Auth and output
167
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
168
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
169
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
170
+ ) -> None:
171
+ """
172
+ Run a query and wait for results.
173
+
174
+ Three modes:
175
+ 1. Builder mode: Use flags like --count, --avg, --where-equals, etc.
176
+ 2. File mode: --from-file query.json
177
+ 3. Spec mode: --spec '{"calculations": [...]}'
178
+ 4. Saved query mode: --query-id query-123
179
+ """
180
+ try:
181
+ client = get_client(profile=profile, api_key=api_key)
182
+
183
+ # Determine which mode we're in
184
+ using_builder = any(
185
+ [
186
+ count,
187
+ avg,
188
+ sum_cols,
189
+ min_calc,
190
+ max_calc,
191
+ p50,
192
+ p90,
193
+ p95,
194
+ p99,
195
+ time_range,
196
+ last_10_minutes,
197
+ last_30_minutes,
198
+ last_1_hour,
199
+ last_2_hours,
200
+ last_8_hours,
201
+ last_24_hours,
202
+ last_7_days,
203
+ where_equals,
204
+ where_ne,
205
+ where_gt,
206
+ where_gte,
207
+ where_lt,
208
+ where_lte,
209
+ where_contains,
210
+ where_exists,
211
+ group_by,
212
+ order_by,
213
+ limit_rows,
214
+ ]
215
+ )
216
+
217
+ mode_count = sum([bool(from_file), bool(spec), bool(query_id), using_builder])
218
+ if mode_count != 1:
219
+ console.print(
220
+ "[red]Error:[/red] Use exactly one mode: builder flags, --from-file, --spec, or --query-id",
221
+ style="bold",
222
+ )
223
+ raise typer.Exit(1)
224
+
225
+ if query_id:
226
+ # Run existing saved query
227
+ result = client.query_results.run(
228
+ dataset=dataset,
229
+ query_id=query_id,
230
+ poll_interval=poll_interval,
231
+ timeout=timeout,
232
+ )
233
+ elif using_builder:
234
+ # Build query using flags
235
+ builder = QueryBuilder().dataset(dataset)
236
+
237
+ # Add calculations
238
+ if count:
239
+ builder.count()
240
+ for col in avg:
241
+ builder.avg(col)
242
+ for col in sum_cols:
243
+ builder.sum(col)
244
+ for col in min_calc:
245
+ builder.min(col)
246
+ for col in max_calc:
247
+ builder.max(col)
248
+ for col in p50:
249
+ builder.p50(col)
250
+ for col in p90:
251
+ builder.p90(col)
252
+ for col in p95:
253
+ builder.p95(col)
254
+ for col in p99:
255
+ builder.p99(col)
256
+
257
+ # Add time range
258
+ if time_range:
259
+ builder.time_range(time_range)
260
+ elif last_10_minutes:
261
+ builder.last_10_minutes()
262
+ elif last_30_minutes:
263
+ builder.last_30_minutes()
264
+ elif last_1_hour:
265
+ builder.last_1_hour()
266
+ elif last_2_hours:
267
+ builder.last_2_hours()
268
+ elif last_8_hours:
269
+ builder.last_8_hours()
270
+ elif last_24_hours:
271
+ builder.last_24_hours()
272
+ elif last_7_days:
273
+ builder.last_7_days()
274
+
275
+ # Add filters
276
+ for filter_spec in where_equals:
277
+ col, val = _parse_filter(filter_spec)
278
+ builder.eq(col, val)
279
+ for filter_spec in where_ne:
280
+ col, val = _parse_filter(filter_spec)
281
+ builder.ne(col, val)
282
+ for filter_spec in where_gt:
283
+ col, val = _parse_filter(filter_spec)
284
+ builder.gt(col, _parse_number(val))
285
+ for filter_spec in where_gte:
286
+ col, val = _parse_filter(filter_spec)
287
+ builder.gte(col, _parse_number(val))
288
+ for filter_spec in where_lt:
289
+ col, val = _parse_filter(filter_spec)
290
+ builder.lt(col, _parse_number(val))
291
+ for filter_spec in where_lte:
292
+ col, val = _parse_filter(filter_spec)
293
+ builder.lte(col, _parse_number(val))
294
+ for filter_spec in where_contains:
295
+ col, val = _parse_filter(filter_spec)
296
+ builder.contains(col, val)
297
+ for col in where_exists:
298
+ builder.exists(col)
299
+
300
+ # Add grouping
301
+ if group_by:
302
+ builder.group_by(*group_by)
303
+
304
+ # Add ordering
305
+ if order_by:
306
+ builder.order_by(order_by)
307
+
308
+ # Add limit
309
+ if limit_rows:
310
+ builder.limit(limit_rows)
311
+
312
+ # Run the query
313
+ _, result = client.query_results.create_and_run(
314
+ spec=builder,
315
+ poll_interval=poll_interval,
316
+ timeout=timeout,
317
+ )
318
+ else:
319
+ # Run ephemeral query from spec
320
+ query_data = (
321
+ json.loads(from_file.read_text()) if from_file else json.loads(spec) # type: ignore
322
+ )
323
+ query_spec = QuerySpec.model_validate(query_data)
324
+ # Use create_and_run for spec-based queries
325
+ _, result = client.query_results.create_and_run(
326
+ spec=query_spec,
327
+ dataset=dataset,
328
+ poll_interval=poll_interval,
329
+ timeout=timeout,
330
+ )
331
+
332
+ console.print("[green]Query completed[/green]")
333
+ output_result(result, output)
334
+ except typer.Exit:
335
+ raise
336
+ except Exception as e:
337
+ console.print(f"[red]Error:[/red] {e}", style="bold")
338
+ raise typer.Exit(1)
339
+
340
+
341
+ @app.command("get-result")
342
+ def get_query_result(
343
+ query_result_id: str = typer.Argument(..., help="Query result ID"),
344
+ dataset: str = typer.Option(
345
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__)"
346
+ ),
347
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
348
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
349
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
350
+ ) -> None:
351
+ """Get results for a specific query execution."""
352
+ try:
353
+ client = get_client(profile=profile, api_key=api_key)
354
+ result = client.query_results.get(dataset=dataset, query_result_id=query_result_id)
355
+ output_result(result, output)
356
+ except Exception as e:
357
+ console.print(f"[red]Error:[/red] {e}", style="bold")
358
+ raise typer.Exit(1)
359
+
360
+
361
+ def _parse_filter(filter_spec: str) -> tuple[str, str]:
362
+ """Parse a filter specification like 'column,value' into (column, value)."""
363
+ parts = filter_spec.split(",", 1)
364
+ if len(parts) != 2:
365
+ console.print(
366
+ f"[red]Error:[/red] Invalid filter format: '{filter_spec}'. Expected: column,value",
367
+ style="bold",
368
+ )
369
+ raise typer.Exit(1)
370
+ return parts[0].strip(), parts[1].strip()
371
+
372
+
373
+ def _parse_number(value: str) -> int | float:
374
+ """Parse a string as int or float."""
375
+ try:
376
+ if "." in value:
377
+ return float(value)
378
+ return int(value)
379
+ except ValueError:
380
+ return value # type: ignore # Return as string if not a number
@@ -0,0 +1,211 @@
1
+ """
2
+ Recipient management commands.
3
+ """
4
+
5
+ import json
6
+ from pathlib import Path
7
+
8
+ import typer
9
+ from rich.console import Console
10
+
11
+ from honeycomb.cli.config import get_client
12
+ from honeycomb.cli.formatters import DEFAULT_OUTPUT_FORMAT, OutputFormat, output_result
13
+ from honeycomb.models.recipients import RecipientCreate
14
+
15
+ app = typer.Typer(help="Manage recipients (notification targets)")
16
+ console = Console()
17
+
18
+
19
+ @app.command("list")
20
+ def list_recipients(
21
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
22
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
23
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
24
+ quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output recipient IDs"),
25
+ ) -> None:
26
+ """List all recipients in the environment."""
27
+ try:
28
+ client = get_client(profile=profile, api_key=api_key)
29
+ recipients = client.recipients.list()
30
+ output_result(
31
+ recipients,
32
+ output,
33
+ columns=["id", "type", "created_at"],
34
+ quiet=quiet,
35
+ )
36
+ except Exception as e:
37
+ console.print(f"[red]Error:[/red] {e}", style="bold")
38
+ raise typer.Exit(1)
39
+
40
+
41
+ @app.command("get")
42
+ def get_recipient(
43
+ recipient_id: str = typer.Argument(..., help="Recipient ID"),
44
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
45
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
46
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
47
+ ) -> None:
48
+ """Get a specific recipient."""
49
+ try:
50
+ client = get_client(profile=profile, api_key=api_key)
51
+ recipient = client.recipients.get(recipient_id=recipient_id)
52
+ output_result(recipient, output)
53
+ except Exception as e:
54
+ console.print(f"[red]Error:[/red] {e}", style="bold")
55
+ raise typer.Exit(1)
56
+
57
+
58
+ @app.command("create")
59
+ def create_recipient(
60
+ from_file: Path = typer.Option(
61
+ ..., "--from-file", "-f", help="JSON file with recipient config"
62
+ ),
63
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
64
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
65
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
66
+ ) -> None:
67
+ """Create a recipient from a JSON file."""
68
+ try:
69
+ client = get_client(profile=profile, api_key=api_key)
70
+
71
+ # Load and parse JSON file
72
+ data = json.loads(from_file.read_text())
73
+
74
+ # Strip fields that shouldn't be in create request
75
+ data.pop("id", None)
76
+ data.pop("created_at", None)
77
+ data.pop("updated_at", None)
78
+
79
+ recipient_create = RecipientCreate.model_validate(data)
80
+ recipient = client.recipients.create(recipient=recipient_create)
81
+
82
+ console.print(
83
+ f"[green]Created recipient ({recipient.type}) with ID: {recipient.id}[/green]"
84
+ )
85
+ output_result(recipient, output)
86
+ except Exception as e:
87
+ console.print(f"[red]Error:[/red] {e}", style="bold")
88
+ raise typer.Exit(1)
89
+
90
+
91
+ @app.command("update")
92
+ def update_recipient(
93
+ recipient_id: str = typer.Argument(..., help="Recipient ID"),
94
+ from_file: Path = typer.Option(
95
+ ..., "--from-file", "-f", help="JSON file with recipient config"
96
+ ),
97
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
98
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
99
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
100
+ ) -> None:
101
+ """Update an existing recipient."""
102
+ try:
103
+ client = get_client(profile=profile, api_key=api_key)
104
+
105
+ # Load and parse JSON file
106
+ data = json.loads(from_file.read_text())
107
+
108
+ # Strip fields that shouldn't be in update request
109
+ data.pop("id", None)
110
+ data.pop("created_at", None)
111
+ data.pop("updated_at", None)
112
+
113
+ recipient_update = RecipientCreate.model_validate(data)
114
+ recipient = client.recipients.update(recipient_id=recipient_id, recipient=recipient_update)
115
+
116
+ console.print(f"[green]Updated recipient {recipient.id}[/green]")
117
+ output_result(recipient, output)
118
+ except Exception as e:
119
+ console.print(f"[red]Error:[/red] {e}", style="bold")
120
+ raise typer.Exit(1)
121
+
122
+
123
+ @app.command("delete")
124
+ def delete_recipient(
125
+ recipient_id: str = typer.Argument(..., help="Recipient ID"),
126
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
127
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
128
+ yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
129
+ ) -> None:
130
+ """Delete a recipient."""
131
+ try:
132
+ if not yes:
133
+ confirm = typer.confirm(f"Delete recipient {recipient_id}?")
134
+ if not confirm:
135
+ console.print("[yellow]Cancelled[/yellow]")
136
+ raise typer.Exit(0)
137
+
138
+ client = get_client(profile=profile, api_key=api_key)
139
+ client.recipients.delete(recipient_id=recipient_id)
140
+ console.print(f"[green]Deleted recipient {recipient_id}[/green]")
141
+ except Exception as e:
142
+ console.print(f"[red]Error:[/red] {e}", style="bold")
143
+ raise typer.Exit(1)
144
+
145
+
146
+ @app.command("export")
147
+ def export_recipient(
148
+ recipient_id: str = typer.Argument(..., help="Recipient ID"),
149
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
150
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
151
+ output_file: Path | None = typer.Option(
152
+ None, "--output-file", "-o", help="Output file (default: stdout)"
153
+ ),
154
+ ) -> None:
155
+ """
156
+ Export a recipient as JSON.
157
+
158
+ Output is suitable for importing to another environment via the 'create' command.
159
+ """
160
+ try:
161
+ client = get_client(profile=profile, api_key=api_key)
162
+ recipient = client.recipients.get(recipient_id=recipient_id)
163
+
164
+ # Export without IDs/timestamps for portability
165
+ data = recipient.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
166
+ json_str = json.dumps(data, indent=2, default=str)
167
+
168
+ if output_file:
169
+ output_file.write_text(json_str)
170
+ console.print(f"[green]Exported recipient to {output_file}[/green]")
171
+ else:
172
+ console.print(json_str)
173
+ except Exception as e:
174
+ console.print(f"[red]Error:[/red] {e}", style="bold")
175
+ raise typer.Exit(1)
176
+
177
+
178
+ @app.command("export-all")
179
+ def export_all_recipients(
180
+ output_dir: Path = typer.Option(..., "--output-dir", help="Output directory"),
181
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
182
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
183
+ ) -> None:
184
+ """Export all recipients to individual JSON files."""
185
+ try:
186
+ output_dir.mkdir(parents=True, exist_ok=True)
187
+
188
+ client = get_client(profile=profile, api_key=api_key)
189
+ recipients = client.recipients.list()
190
+
191
+ for recipient in recipients:
192
+ # Export without IDs/timestamps
193
+ data = recipient.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
194
+
195
+ # Use recipient ID and type for filename
196
+ filename = f"{recipient.type.value}_{recipient.id}.json"
197
+ file_path = output_dir / filename
198
+
199
+ with open(file_path, "w") as f:
200
+ json.dump(data, f, indent=2, default=str)
201
+
202
+ console.print(
203
+ f"[green]Exported {recipient.type.value} recipient to {file_path}[/green]"
204
+ )
205
+
206
+ console.print(
207
+ f"\n[bold green]Exported {len(recipients)} recipients to {output_dir}[/bold green]"
208
+ )
209
+ except Exception as e:
210
+ console.print(f"[red]Error:[/red] {e}", style="bold")
211
+ raise typer.Exit(1)