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,240 @@
1
+ """Environments management commands (v2 team-scoped)."""
2
+
3
+ import typer
4
+ from rich.console import Console
5
+
6
+ from honeycomb.cli.config import get_api_key_from_config, get_client
7
+ from honeycomb.cli.formatters import DEFAULT_OUTPUT_FORMAT, OutputFormat, output_result
8
+ from honeycomb.models.environments import EnvironmentColor, EnvironmentCreate
9
+
10
+ app = typer.Typer(help="Manage environments (requires management key)")
11
+ console = Console()
12
+
13
+
14
+ @app.command("list")
15
+ def list_environments(
16
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile to use"),
17
+ management_key: str | None = typer.Option(
18
+ None, "--management-key", envvar="HONEYCOMB_MANAGEMENT_KEY"
19
+ ),
20
+ management_secret: str | None = typer.Option(
21
+ None, "--management-secret", envvar="HONEYCOMB_MANAGEMENT_SECRET"
22
+ ),
23
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
24
+ ) -> None:
25
+ """List all environments for your authenticated team.
26
+
27
+ Examples:
28
+ hny environments list
29
+ """
30
+ try:
31
+ client = get_client(
32
+ profile=profile,
33
+ management_key=management_key,
34
+ management_secret=management_secret,
35
+ )
36
+
37
+ envs = client.environments.list()
38
+ output_result(envs, output)
39
+
40
+ except Exception as e:
41
+ console.print(f"[red]Error:[/red] {e}", style="bold")
42
+ raise typer.Exit(1)
43
+
44
+
45
+ @app.command("get")
46
+ def get_environment(
47
+ env_id: str = typer.Argument(..., help="Environment ID"),
48
+ with_datasets: bool = typer.Option(
49
+ False, "--with-datasets", help="Also list datasets in this environment"
50
+ ),
51
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile to use"),
52
+ management_key: str | None = typer.Option(
53
+ None, "--management-key", envvar="HONEYCOMB_MANAGEMENT_KEY"
54
+ ),
55
+ management_secret: str | None = typer.Option(
56
+ None, "--management-secret", envvar="HONEYCOMB_MANAGEMENT_SECRET"
57
+ ),
58
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
59
+ ) -> None:
60
+ """Get a specific environment by ID for your authenticated team.
61
+
62
+ Examples:
63
+ hny environments get env-123
64
+ hny environments get env-123 --with-datasets
65
+ """
66
+ try:
67
+ client = get_client(
68
+ profile=profile,
69
+ management_key=management_key,
70
+ management_secret=management_secret,
71
+ )
72
+
73
+ env = client.environments.get(env_id=env_id)
74
+ output_result(env, output)
75
+
76
+ # Optionally list datasets
77
+ if with_datasets:
78
+ api_key = get_api_key_from_config(profile)
79
+ if not api_key:
80
+ console.print(
81
+ "\n[yellow]Cannot list datasets:[/yellow] No HONEYCOMB_API_KEY found. "
82
+ "Set HONEYCOMB_API_KEY environment variable or add api_key to your profile.",
83
+ style="bold",
84
+ )
85
+ return
86
+
87
+ # Create temporary client with API key to verify environment match
88
+ from honeycomb import HoneycombClient
89
+
90
+ with HoneycombClient(api_key=api_key, sync=True) as api_key_client:
91
+ # Verify the API key is for this environment (force v1 for environment_slug)
92
+ from honeycomb.models.auth import AuthInfo
93
+
94
+ auth_info = api_key_client.auth.get(use_v2=False)
95
+ assert isinstance(auth_info, AuthInfo) # use_v2=False always returns AuthInfo
96
+ if auth_info.environment_slug != env.slug:
97
+ console.print(
98
+ f"\n[yellow]Cannot list datasets:[/yellow] HONEYCOMB_API_KEY is for environment "
99
+ f"'{auth_info.environment_slug}' but you requested '{env.slug}'. "
100
+ "Provide an API key for the correct environment.",
101
+ style="bold",
102
+ )
103
+ return
104
+
105
+ # Environment matches - list datasets
106
+ console.print("\n[cyan]Datasets in this environment:[/cyan]")
107
+ datasets = api_key_client.datasets.list()
108
+ output_result(datasets, output)
109
+
110
+ except Exception as e:
111
+ console.print(f"[red]Error:[/red] {e}", style="bold")
112
+ raise typer.Exit(1)
113
+
114
+
115
+ @app.command("create")
116
+ def create_environment(
117
+ name: str = typer.Option(..., "--name", help="Environment name"),
118
+ description: str | None = typer.Option(None, "--description", "-d", help="Description"),
119
+ color: EnvironmentColor | None = typer.Option(None, "--color", help="Display color"),
120
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile to use"),
121
+ management_key: str | None = typer.Option(
122
+ None, "--management-key", envvar="HONEYCOMB_MANAGEMENT_KEY"
123
+ ),
124
+ management_secret: str | None = typer.Option(
125
+ None, "--management-secret", envvar="HONEYCOMB_MANAGEMENT_SECRET"
126
+ ),
127
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
128
+ ) -> None:
129
+ """Create a new environment for your authenticated team.
130
+
131
+ Examples:
132
+ hny environments create --name "Production"
133
+ hny environments create --name "Staging" --color blue --description "Staging env"
134
+ """
135
+ try:
136
+ client = get_client(
137
+ profile=profile,
138
+ management_key=management_key,
139
+ management_secret=management_secret,
140
+ )
141
+
142
+ environment = EnvironmentCreate(
143
+ name=name,
144
+ description=description,
145
+ color=color,
146
+ )
147
+
148
+ created = client.environments.create(environment=environment)
149
+ output_result(created, output)
150
+
151
+ except Exception as e:
152
+ console.print(f"[red]Error:[/red] {e}", style="bold")
153
+ raise typer.Exit(1)
154
+
155
+
156
+ @app.command("update")
157
+ def update_environment(
158
+ env_id: str = typer.Argument(..., help="Environment ID"),
159
+ description: str | None = typer.Option(None, "--description", "-d", help="New description"),
160
+ color: EnvironmentColor | None = typer.Option(None, "--color", help="New color"),
161
+ delete_protected: bool | None = typer.Option(
162
+ None, "--delete-protected/--no-delete-protected", help="Enable/disable delete protection"
163
+ ),
164
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile to use"),
165
+ management_key: str | None = typer.Option(
166
+ None, "--management-key", envvar="HONEYCOMB_MANAGEMENT_KEY"
167
+ ),
168
+ management_secret: str | None = typer.Option(
169
+ None, "--management-secret", envvar="HONEYCOMB_MANAGEMENT_SECRET"
170
+ ),
171
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
172
+ ) -> None:
173
+ """Update an environment for your authenticated team.
174
+
175
+ Examples:
176
+ hny environments update env-123 --description "Updated"
177
+ hny environments update env-123 --no-delete-protected
178
+ """
179
+ try:
180
+ from honeycomb.models.environments import EnvironmentUpdate
181
+
182
+ client = get_client(
183
+ profile=profile,
184
+ management_key=management_key,
185
+ management_secret=management_secret,
186
+ )
187
+
188
+ update = EnvironmentUpdate(
189
+ description=description,
190
+ color=color,
191
+ delete_protected=delete_protected,
192
+ )
193
+
194
+ updated = client.environments.update(env_id=env_id, environment=update)
195
+ output_result(updated, output)
196
+
197
+ except Exception as e:
198
+ console.print(f"[red]Error:[/red] {e}", style="bold")
199
+ raise typer.Exit(1)
200
+
201
+
202
+ @app.command("delete")
203
+ def delete_environment(
204
+ env_id: str = typer.Argument(..., help="Environment ID"),
205
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile to use"),
206
+ management_key: str | None = typer.Option(
207
+ None, "--management-key", envvar="HONEYCOMB_MANAGEMENT_KEY"
208
+ ),
209
+ management_secret: str | None = typer.Option(
210
+ None, "--management-secret", envvar="HONEYCOMB_MANAGEMENT_SECRET"
211
+ ),
212
+ yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
213
+ ) -> None:
214
+ """Delete an environment for your authenticated team.
215
+
216
+ Note: Environment must not be delete-protected.
217
+
218
+ Examples:
219
+ hny environments delete env-123
220
+ hny environments delete env-123 --yes
221
+ """
222
+ try:
223
+ if not yes:
224
+ confirm = typer.confirm(f"Delete environment {env_id}?")
225
+ if not confirm:
226
+ console.print("Cancelled")
227
+ raise typer.Exit(0)
228
+
229
+ client = get_client(
230
+ profile=profile,
231
+ management_key=management_key,
232
+ management_secret=management_secret,
233
+ )
234
+
235
+ client.environments.delete(env_id=env_id)
236
+ console.print(f"[green]Deleted environment:[/green] {env_id}")
237
+
238
+ except Exception as e:
239
+ console.print(f"[red]Error:[/red] {e}", style="bold")
240
+ raise typer.Exit(1)
@@ -0,0 +1,242 @@
1
+ """
2
+ Output formatters for CLI commands.
3
+
4
+ Supports table, JSON, and YAML output formats.
5
+ """
6
+
7
+ import json
8
+ from enum import Enum
9
+ from typing import Any
10
+
11
+ import yaml
12
+ from pydantic import BaseModel
13
+ from rich.console import Console
14
+ from rich.table import Table
15
+
16
+ console = Console()
17
+
18
+
19
+ class OutputFormat(str, Enum):
20
+ """Output format for CLI commands."""
21
+
22
+ table = "table"
23
+ json = "json"
24
+ yaml = "yaml"
25
+
26
+
27
+ # Default output format for CLI commands
28
+ DEFAULT_OUTPUT_FORMAT = OutputFormat.table
29
+
30
+
31
+ def output_result(
32
+ data: Any,
33
+ format: OutputFormat,
34
+ columns: list[str] | None = None,
35
+ quiet: bool = False,
36
+ column_titles: dict[str, str] | None = None,
37
+ ) -> None:
38
+ """
39
+ Output data in the specified format.
40
+
41
+ Args:
42
+ data: Data to output (Pydantic model, list of models, or dict)
43
+ format: Output format (table, json, yaml)
44
+ columns: Column names for table output (only used if format is table)
45
+ quiet: If True, only output IDs (one per line)
46
+ column_titles: Optional mapping of column names to display titles
47
+ """
48
+ # Handle quiet mode
49
+ if quiet:
50
+ if isinstance(data, list):
51
+ for item in data:
52
+ if isinstance(item, BaseModel):
53
+ console.print(item.id if hasattr(item, "id") else str(item))
54
+ elif isinstance(item, dict):
55
+ console.print(item.get("id", str(item)))
56
+ elif isinstance(data, BaseModel):
57
+ console.print(data.id if hasattr(data, "id") else str(data))
58
+ elif isinstance(data, dict):
59
+ console.print(data.get("id", str(data)))
60
+ return
61
+
62
+ # Special handling for QueryResult objects in table mode (duck typing check)
63
+ if (
64
+ format == OutputFormat.table
65
+ and isinstance(data, BaseModel)
66
+ and hasattr(data, "data")
67
+ and data.data is not None
68
+ and hasattr(data.data, "rows")
69
+ ):
70
+ _output_query_result(data)
71
+ return
72
+
73
+ # Convert Pydantic models to dicts for easier handling
74
+ data_dict: Any
75
+ if isinstance(data, BaseModel):
76
+ data_dict = data.model_dump(mode="json")
77
+ elif isinstance(data, list) and data and isinstance(data[0], BaseModel):
78
+ data_dict = [item.model_dump(mode="json") for item in data]
79
+ else:
80
+ data_dict = data
81
+
82
+ # Output in requested format
83
+ if format == OutputFormat.json:
84
+ console.print(json.dumps(data_dict, indent=2, default=str))
85
+ elif format == OutputFormat.yaml:
86
+ console.print(yaml.dump(data_dict, default_flow_style=False, sort_keys=False))
87
+ elif format == OutputFormat.table:
88
+ if isinstance(data_dict, list):
89
+ _output_table(data_dict, columns, column_titles)
90
+ else:
91
+ # Single item - output as key-value pairs
92
+ _output_single_item(data_dict)
93
+
94
+
95
+ def _output_table(
96
+ data: list[dict[str, Any]],
97
+ columns: list[str] | None = None,
98
+ column_titles: dict[str, str] | None = None,
99
+ ) -> None:
100
+ """Output a list of items as a table."""
101
+ if not data:
102
+ console.print("[yellow]No results found[/yellow]")
103
+ return
104
+
105
+ # Determine columns to display
106
+ if columns is None:
107
+ # Use all keys from first item, excluding timestamp fields
108
+ all_columns = list(data[0].keys())
109
+ # Filter out timestamp fields (can be added back with explicit columns parameter)
110
+ columns = [
111
+ col for col in all_columns if col not in ("created_at", "updated_at", "timestamps")
112
+ ]
113
+
114
+ table = Table()
115
+ for col in columns:
116
+ # Use custom title if provided, otherwise auto-generate from column name
117
+ title = column_titles.get(col) if column_titles else None
118
+ if title is None:
119
+ title = col.replace("_", " ").title()
120
+ # ID columns should never truncate
121
+ if col == "id" or col.endswith("_id"):
122
+ table.add_column(title, style="cyan", no_wrap=True)
123
+ else:
124
+ table.add_column(title, style="cyan")
125
+
126
+ for item in data:
127
+ row = []
128
+ for col in columns:
129
+ value = item.get(col)
130
+ # Display "-" for missing or None values
131
+ row.append(str(value) if value is not None else "-")
132
+ table.add_row(*row)
133
+
134
+ console.print(table)
135
+
136
+
137
+ def _output_single_item(data: dict[str, Any]) -> None:
138
+ """Output a single item as key-value pairs in a table."""
139
+ from rich import box
140
+
141
+ table = Table(show_header=True, box=box.ROUNDED, padding=(0, 1))
142
+ table.add_column("Field", style="cyan bold", no_wrap=True)
143
+ table.add_column("Value", style="white")
144
+
145
+ for key, value in data.items():
146
+ # Format complex values with nested tables/panels for clarity
147
+ value_display: Any
148
+ if isinstance(value, dict):
149
+ if value:
150
+ # Create a mini-table for dict values
151
+ nested_table = Table(show_header=False, box=box.SIMPLE, padding=(0, 1))
152
+ nested_table.add_column("Key", style="cyan")
153
+ nested_table.add_column("Value", style="white")
154
+ for k, v in value.items():
155
+ nested_table.add_row(str(k), str(v))
156
+ value_display = nested_table
157
+ else:
158
+ value_display = "{}"
159
+ elif isinstance(value, list):
160
+ if value:
161
+ # Special handling for scopes - split on ':' to show resource:permission
162
+ if key == "scopes" and value and isinstance(value[0], str) and ":" in value[0]:
163
+ nested_table = Table(show_header=False, box=box.SIMPLE, padding=(0, 1))
164
+ nested_table.add_column("Resource", style="cyan")
165
+ nested_table.add_column("Permission", style="white")
166
+ for item in value:
167
+ parts = str(item).split(":", 1)
168
+ if len(parts) == 2:
169
+ nested_table.add_row(parts[0], parts[1])
170
+ else:
171
+ nested_table.add_row(str(item), "")
172
+ value_display = nested_table
173
+ else:
174
+ # Regular list - single column
175
+ nested_table = Table(show_header=False, box=box.SIMPLE, padding=(0, 1))
176
+ nested_table.add_column("Value", style="white")
177
+ for item in value:
178
+ nested_table.add_row(str(item))
179
+ value_display = nested_table
180
+ else:
181
+ value_display = "[]"
182
+ else:
183
+ value_display = str(value)
184
+
185
+ table.add_row(key, value_display)
186
+
187
+ console.print(table)
188
+
189
+
190
+ def _output_query_result(result: Any) -> None:
191
+ """Output a QueryResult object with proper formatting.
192
+
193
+ Displays query results as a table with breakdown columns and calculation results.
194
+ Shows query URL and result count.
195
+ """
196
+ # Check if data is available
197
+ if not result.data or not hasattr(result.data, "rows"):
198
+ console.print("[yellow]No data available (query may still be processing)[/yellow]")
199
+ return
200
+
201
+ rows = result.data.rows
202
+
203
+ if not rows:
204
+ console.print("[yellow]Query returned no results[/yellow]")
205
+ # Still show the query URL
206
+ if result.links and "query_url" in result.links:
207
+ console.print(f"\n[dim]View in UI: {result.links['query_url']}[/dim]")
208
+ return
209
+
210
+ # Create table with all columns from first row
211
+ table = Table(title=f"Query Results ({len(rows)} rows)")
212
+
213
+ # Get all column names from first row
214
+ columns = list(rows[0].keys())
215
+
216
+ for col in columns:
217
+ # Style calculation columns differently
218
+ if col.isupper() or col.startswith("P"): # COUNT, AVG, P99, etc.
219
+ table.add_column(col, style="green bold", justify="right")
220
+ else:
221
+ table.add_column(col, style="cyan")
222
+
223
+ # Add rows
224
+ for row in rows:
225
+ formatted_row = []
226
+ for col in columns:
227
+ value = row.get(col, "-")
228
+ # Format numbers nicely
229
+ if isinstance(value, (int, float)):
230
+ if isinstance(value, float):
231
+ formatted_row.append(f"{value:.2f}")
232
+ else:
233
+ formatted_row.append(str(value))
234
+ else:
235
+ formatted_row.append(str(value))
236
+ table.add_row(*formatted_row)
237
+
238
+ console.print(table)
239
+
240
+ # Show query metadata
241
+ if result.links and "query_url" in result.links:
242
+ console.print(f"\n[dim]View in UI: {result.links['query_url']}[/dim]")
@@ -0,0 +1,151 @@
1
+ """
2
+ Marker 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.markers import MarkerCreate
14
+
15
+ app = typer.Typer(help="Manage markers (event annotations)")
16
+ console = Console()
17
+
18
+
19
+ @app.command("list")
20
+ def list_markers(
21
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
22
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
23
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
24
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
25
+ quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output marker IDs"),
26
+ ) -> None:
27
+ """List all markers in a dataset."""
28
+ try:
29
+ client = get_client(profile=profile, api_key=api_key)
30
+ markers = client.markers.list(dataset=dataset)
31
+ output_result(
32
+ markers,
33
+ output,
34
+ columns=["id", "message", "type", "start_time", "created_at"],
35
+ quiet=quiet,
36
+ )
37
+ except Exception as e:
38
+ console.print(f"[red]Error:[/red] {e}", style="bold")
39
+ raise typer.Exit(1)
40
+
41
+
42
+ @app.command("get")
43
+ def get_marker(
44
+ marker_id: str = typer.Argument(..., help="Marker ID"),
45
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
46
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
47
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
48
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
49
+ ) -> None:
50
+ """Get a specific marker by ID."""
51
+ try:
52
+ client = get_client(profile=profile, api_key=api_key)
53
+ # Markers API doesn't have a direct get, so list and filter
54
+ markers = client.markers.list(dataset=dataset)
55
+ marker = next((m for m in markers if m.id == marker_id), None)
56
+
57
+ if marker is None:
58
+ console.print(f"[red]Error:[/red] Marker {marker_id} not found", style="bold")
59
+ raise typer.Exit(1)
60
+
61
+ output_result(marker, output)
62
+ except typer.Exit:
63
+ raise
64
+ except Exception as e:
65
+ console.print(f"[red]Error:[/red] {e}", style="bold")
66
+ raise typer.Exit(1)
67
+
68
+
69
+ @app.command("create")
70
+ def create_marker(
71
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
72
+ from_file: Path = typer.Option(..., "--from-file", "-f", help="JSON file with marker config"),
73
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
74
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
75
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
76
+ ) -> None:
77
+ """Create a marker from a JSON file."""
78
+ try:
79
+ client = get_client(profile=profile, api_key=api_key)
80
+
81
+ # Load and parse JSON file
82
+ data = json.loads(from_file.read_text())
83
+
84
+ # Strip fields that shouldn't be in create request
85
+ data.pop("id", None)
86
+ data.pop("created_at", None)
87
+ data.pop("updated_at", None)
88
+
89
+ marker_create = MarkerCreate.model_validate(data)
90
+ marker = client.markers.create(dataset=dataset, marker=marker_create)
91
+
92
+ console.print(f"[green]Created marker with ID: {marker.id}[/green]")
93
+ output_result(marker, output)
94
+ except Exception as e:
95
+ console.print(f"[red]Error:[/red] {e}", style="bold")
96
+ raise typer.Exit(1)
97
+
98
+
99
+ @app.command("update")
100
+ def update_marker(
101
+ marker_id: str = typer.Argument(..., help="Marker ID"),
102
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
103
+ from_file: Path = typer.Option(..., "--from-file", "-f", help="JSON file with marker config"),
104
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
105
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
106
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
107
+ ) -> None:
108
+ """Update an existing marker."""
109
+ try:
110
+ client = get_client(profile=profile, api_key=api_key)
111
+
112
+ # Load and parse JSON file
113
+ data = json.loads(from_file.read_text())
114
+
115
+ # Strip fields that shouldn't be in update request
116
+ data.pop("id", None)
117
+ data.pop("created_at", None)
118
+ data.pop("updated_at", None)
119
+
120
+ marker_update = MarkerCreate.model_validate(data)
121
+ marker = client.markers.update(dataset=dataset, marker_id=marker_id, marker=marker_update)
122
+
123
+ console.print(f"[green]Updated marker {marker.id}[/green]")
124
+ output_result(marker, output)
125
+ except Exception as e:
126
+ console.print(f"[red]Error:[/red] {e}", style="bold")
127
+ raise typer.Exit(1)
128
+
129
+
130
+ @app.command("delete")
131
+ def delete_marker(
132
+ marker_id: str = typer.Argument(..., help="Marker ID"),
133
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
134
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
135
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
136
+ yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
137
+ ) -> None:
138
+ """Delete a marker."""
139
+ try:
140
+ if not yes:
141
+ confirm = typer.confirm(f"Delete marker {marker_id} from dataset {dataset}?")
142
+ if not confirm:
143
+ console.print("[yellow]Cancelled[/yellow]")
144
+ raise typer.Exit(0)
145
+
146
+ client = get_client(profile=profile, api_key=api_key)
147
+ client.markers.delete(dataset=dataset, marker_id=marker_id)
148
+ console.print(f"[green]Deleted marker {marker_id}[/green]")
149
+ except Exception as e:
150
+ console.print(f"[red]Error:[/red] {e}", style="bold")
151
+ raise typer.Exit(1)