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,259 @@
1
+ """
2
+ Configuration management for the Honeycomb CLI.
3
+
4
+ Handles profiles, credentials, and client initialization.
5
+ """
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ import typer
12
+ import yaml
13
+ from rich.console import Console
14
+ from rich.table import Table
15
+
16
+ from honeycomb import HoneycombClient
17
+
18
+ app = typer.Typer(help="Manage CLI configuration and profiles")
19
+ console = Console()
20
+
21
+ CONFIG_DIR = Path.home() / ".honeycomb"
22
+ CONFIG_FILE = CONFIG_DIR / "config.yaml"
23
+
24
+
25
+ def _ensure_config_dir() -> None:
26
+ """Ensure the config directory exists."""
27
+ CONFIG_DIR.mkdir(exist_ok=True)
28
+
29
+
30
+ def _load_config() -> dict[str, Any]:
31
+ """Load the config file, returning empty dict if it doesn't exist."""
32
+ if not CONFIG_FILE.exists():
33
+ return {}
34
+ with open(CONFIG_FILE) as f:
35
+ return yaml.safe_load(f) or {}
36
+
37
+
38
+ def _save_config(config: dict[str, Any]) -> None:
39
+ """Save the config file."""
40
+ _ensure_config_dir()
41
+ with open(CONFIG_FILE, "w") as f:
42
+ yaml.safe_dump(config, f, default_flow_style=False)
43
+
44
+
45
+ def get_api_key_from_config(profile: str | None = None) -> str | None:
46
+ """
47
+ Get API key from environment or config.
48
+
49
+ Priority order:
50
+ 1. Environment variable (HONEYCOMB_API_KEY)
51
+ 2. Profile from config file
52
+ 3. Default profile from config file
53
+
54
+ Returns:
55
+ API key string or None if not found
56
+ """
57
+ # Try environment variable
58
+ env_api_key = os.environ.get("HONEYCOMB_API_KEY")
59
+ if env_api_key:
60
+ return env_api_key
61
+
62
+ # Try profile from config file
63
+ config = _load_config()
64
+ profiles = config.get("profiles", {})
65
+
66
+ # Use specified profile or default
67
+ profile_name = profile or config.get("default_profile")
68
+ if not profile_name or profile_name not in profiles:
69
+ return None
70
+
71
+ return profiles[profile_name].get("api_key")
72
+
73
+
74
+ def get_client(
75
+ profile: str | None = None,
76
+ api_key: str | None = None,
77
+ management_key: str | None = None,
78
+ management_secret: str | None = None,
79
+ base_url: str | None = None,
80
+ ) -> HoneycombClient:
81
+ """
82
+ Get a configured Honeycomb client.
83
+
84
+ Priority order:
85
+ 1. Explicit parameters (api_key, management_key, etc.)
86
+ 2. Environment variables (HONEYCOMB_API_KEY, etc.)
87
+ 3. Profile from config file
88
+ 4. Default profile from config file
89
+ """
90
+ # If explicit credentials provided, use them
91
+ if api_key or management_key:
92
+ return HoneycombClient(
93
+ api_key=api_key,
94
+ management_key=management_key,
95
+ management_secret=management_secret,
96
+ base_url=base_url or "https://api.honeycomb.io",
97
+ sync=True,
98
+ )
99
+
100
+ # Try environment variables
101
+ env_api_key = os.environ.get("HONEYCOMB_API_KEY")
102
+ env_mgmt_key = os.environ.get("HONEYCOMB_MANAGEMENT_KEY")
103
+ env_mgmt_secret = os.environ.get("HONEYCOMB_MANAGEMENT_SECRET")
104
+
105
+ if env_api_key or env_mgmt_key:
106
+ return HoneycombClient(
107
+ api_key=env_api_key,
108
+ management_key=env_mgmt_key,
109
+ management_secret=env_mgmt_secret,
110
+ base_url=base_url or "https://api.honeycomb.io",
111
+ sync=True,
112
+ )
113
+
114
+ # Try profile from config file
115
+ config = _load_config()
116
+ profiles = config.get("profiles", {})
117
+
118
+ # Use specified profile or default
119
+ profile_name = profile or config.get("default_profile")
120
+
121
+ if not profile_name:
122
+ console.print(
123
+ "[red]Error:[/red] No credentials found. Provide --api-key or configure a profile.",
124
+ style="bold",
125
+ )
126
+ raise typer.Exit(1)
127
+
128
+ if profile_name not in profiles:
129
+ console.print(
130
+ f"[red]Error:[/red] Profile '{profile_name}' not found in {CONFIG_FILE}",
131
+ style="bold",
132
+ )
133
+ raise typer.Exit(1)
134
+
135
+ profile_config = profiles[profile_name]
136
+ return HoneycombClient(
137
+ api_key=profile_config.get("api_key"),
138
+ management_key=profile_config.get("management_key"),
139
+ management_secret=profile_config.get("management_secret"),
140
+ base_url=profile_config.get("base_url", "https://api.honeycomb.io"),
141
+ sync=True,
142
+ )
143
+
144
+
145
+ @app.command("show")
146
+ def show_config() -> None:
147
+ """Show current configuration."""
148
+ if not CONFIG_FILE.exists():
149
+ console.print(f"[yellow]No config file found at {CONFIG_FILE}[/yellow]")
150
+ return
151
+
152
+ config = _load_config()
153
+
154
+ # Display default profile
155
+ default_profile = config.get("default_profile")
156
+ if default_profile:
157
+ console.print(f"[bold]Default profile:[/bold] {default_profile}\n")
158
+ else:
159
+ console.print("[yellow]No default profile set[/yellow]\n")
160
+
161
+ # Display profiles table
162
+ profiles = config.get("profiles", {})
163
+ if not profiles:
164
+ console.print("[yellow]No profiles configured[/yellow]")
165
+ return
166
+
167
+ table = Table(title="Profiles")
168
+ table.add_column("Name", style="cyan")
169
+ table.add_column("API Key", style="green")
170
+ table.add_column("Management Key", style="green")
171
+ table.add_column("Base URL", style="blue")
172
+
173
+ for name, profile in profiles.items():
174
+ api_key = profile.get("api_key", "")
175
+ mgmt_key = profile.get("management_key", "")
176
+ base_url = profile.get("base_url", "https://api.honeycomb.io")
177
+
178
+ # Mask keys for security
179
+ api_key_display = f"{api_key[:10]}..." if api_key else "-"
180
+ mgmt_key_display = f"{mgmt_key[:10]}..." if mgmt_key else "-"
181
+
182
+ table.add_row(name, api_key_display, mgmt_key_display, base_url)
183
+
184
+ console.print(table)
185
+
186
+
187
+ @app.command("add-profile")
188
+ def add_profile(
189
+ name: str = typer.Argument(..., help="Profile name"),
190
+ api_key: str | None = typer.Option(None, "--api-key", help="API key"),
191
+ management_key: str | None = typer.Option(None, "--management-key", help="Management key"),
192
+ management_secret: str | None = typer.Option(
193
+ None, "--management-secret", help="Management secret"
194
+ ),
195
+ base_url: str | None = typer.Option(
196
+ None, "--base-url", help="Base URL (default: https://api.honeycomb.io)"
197
+ ),
198
+ set_default: bool = typer.Option(False, "--set-default", help="Set as default profile"),
199
+ ) -> None:
200
+ """Add or update a profile."""
201
+ if not api_key and not management_key:
202
+ console.print("[red]Error:[/red] Must provide --api-key or --management-key", style="bold")
203
+ raise typer.Exit(1)
204
+
205
+ if management_key and not management_secret:
206
+ console.print(
207
+ "[red]Error:[/red] --management-secret required when using --management-key",
208
+ style="bold",
209
+ )
210
+ raise typer.Exit(1)
211
+
212
+ config = _load_config()
213
+ if "profiles" not in config:
214
+ config["profiles"] = {}
215
+
216
+ config["profiles"][name] = {}
217
+ if api_key:
218
+ config["profiles"][name]["api_key"] = api_key
219
+ if management_key:
220
+ config["profiles"][name]["management_key"] = management_key
221
+ config["profiles"][name]["management_secret"] = management_secret
222
+ if base_url:
223
+ config["profiles"][name]["base_url"] = base_url
224
+
225
+ if set_default:
226
+ config["default_profile"] = name
227
+
228
+ _save_config(config)
229
+ console.print(f"[green]Profile '{name}' saved to {CONFIG_FILE}[/green]")
230
+
231
+
232
+ @app.command("remove-profile")
233
+ def remove_profile(name: str = typer.Argument(..., help="Profile name")) -> None:
234
+ """Remove a profile."""
235
+ config = _load_config()
236
+ profiles = config.get("profiles", {})
237
+
238
+ if name not in profiles:
239
+ console.print(f"[red]Error:[/red] Profile '{name}' not found", style="bold")
240
+ raise typer.Exit(1)
241
+
242
+ del profiles[name]
243
+ _save_config(config)
244
+ console.print(f"[green]Profile '{name}' removed[/green]")
245
+
246
+
247
+ @app.command("set-default")
248
+ def set_default(name: str = typer.Argument(..., help="Profile name")) -> None:
249
+ """Set the default profile."""
250
+ config = _load_config()
251
+ profiles = config.get("profiles", {})
252
+
253
+ if name not in profiles:
254
+ console.print(f"[red]Error:[/red] Profile '{name}' not found", style="bold")
255
+ raise typer.Exit(1)
256
+
257
+ config["default_profile"] = name
258
+ _save_config(config)
259
+ console.print(f"[green]Default profile set to '{name}'[/green]")
@@ -0,0 +1,186 @@
1
+ """
2
+ Dataset 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.datasets import DatasetCreate, DatasetUpdate
14
+
15
+ app = typer.Typer(help="Manage datasets")
16
+ console = Console()
17
+
18
+
19
+ @app.command("list")
20
+ def list_datasets(
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 dataset slugs"),
25
+ ) -> None:
26
+ """List all datasets in the environment."""
27
+ try:
28
+ client = get_client(profile=profile, api_key=api_key)
29
+ datasets = client.datasets.list()
30
+ output_result(
31
+ datasets, output, columns=["slug", "name", "description", "created_at"], quiet=quiet
32
+ )
33
+ except Exception as e:
34
+ console.print(f"[red]Error:[/red] {e}", style="bold")
35
+ raise typer.Exit(1)
36
+
37
+
38
+ @app.command("get")
39
+ def get_dataset(
40
+ slug: str = typer.Argument(..., help="Dataset slug"),
41
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
42
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
43
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
44
+ ) -> None:
45
+ """Get a specific dataset."""
46
+ try:
47
+ client = get_client(profile=profile, api_key=api_key)
48
+ dataset = client.datasets.get(slug=slug)
49
+ output_result(dataset, output)
50
+ except Exception as e:
51
+ console.print(f"[red]Error:[/red] {e}", style="bold")
52
+ raise typer.Exit(1)
53
+
54
+
55
+ @app.command("create")
56
+ def create_dataset(
57
+ name: str | None = typer.Option(None, "--name", "-n", help="Dataset name"),
58
+ slug: str | None = typer.Option(None, "--slug", "-s", help="Dataset slug"),
59
+ description: str | None = typer.Option(None, "--description", "-d", help="Dataset description"),
60
+ from_file: Path | None = typer.Option(
61
+ None, "--from-file", "-f", help="JSON file with dataset 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 new dataset."""
68
+ try:
69
+ client = get_client(profile=profile, api_key=api_key)
70
+
71
+ if from_file:
72
+ # Load from JSON file
73
+ data = json.loads(from_file.read_text())
74
+ data.pop("created_at", None)
75
+ data.pop("updated_at", None)
76
+ dataset_create = DatasetCreate.model_validate(data)
77
+ elif name and slug:
78
+ # Create from CLI arguments
79
+ dataset_create = DatasetCreate(name=name, slug=slug, description=description)
80
+ else:
81
+ console.print(
82
+ "[red]Error:[/red] Provide --name and --slug, or --from-file", style="bold"
83
+ )
84
+ raise typer.Exit(1)
85
+
86
+ dataset = client.datasets.create(dataset=dataset_create)
87
+
88
+ console.print(f"[green]Created dataset '{dataset.name}' with slug: {dataset.slug}[/green]")
89
+ output_result(dataset, output)
90
+ except Exception as e:
91
+ console.print(f"[red]Error:[/red] {e}", style="bold")
92
+ raise typer.Exit(1)
93
+
94
+
95
+ @app.command("update")
96
+ def update_dataset(
97
+ slug: str = typer.Argument(..., help="Dataset slug"),
98
+ name: str | None = typer.Option(None, "--name", "-n", help="New dataset name"),
99
+ description: str | None = typer.Option(None, "--description", "-d", help="New description"),
100
+ delete_protected: bool | None = typer.Option(
101
+ None, "--delete-protected/--no-delete-protected", help="Enable/disable delete protection"
102
+ ),
103
+ from_file: Path | None = typer.Option(
104
+ None, "--from-file", "-f", help="JSON file with dataset config"
105
+ ),
106
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
107
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
108
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
109
+ ) -> None:
110
+ """Update an existing dataset.
111
+
112
+ Examples:
113
+ hny datasets update my-dataset --description "Updated description"
114
+ hny datasets update my-dataset --delete-protected
115
+ hny datasets update my-dataset --no-delete-protected
116
+ """
117
+ try:
118
+ client = get_client(profile=profile, api_key=api_key)
119
+
120
+ update_payload: DatasetCreate | DatasetUpdate
121
+ if from_file:
122
+ # Load from JSON file
123
+ data = json.loads(from_file.read_text())
124
+ data.pop("slug", None) # Can't change slug
125
+ data.pop("created_at", None)
126
+ data.pop("updated_at", None)
127
+ update_payload = DatasetCreate.model_validate(data)
128
+ elif name or description is not None or delete_protected is not None:
129
+ # Use DatasetUpdate for partial updates
130
+ update_payload = DatasetUpdate(
131
+ name=name,
132
+ description=description,
133
+ delete_protected=delete_protected,
134
+ )
135
+ else:
136
+ console.print(
137
+ "[red]Error:[/red] Provide --name, --description, "
138
+ "--delete-protected/--no-delete-protected, or --from-file",
139
+ style="bold",
140
+ )
141
+ raise typer.Exit(1)
142
+
143
+ dataset = client.datasets.update(slug=slug, dataset=update_payload)
144
+
145
+ console.print(f"[green]Updated dataset '{dataset.name}'[/green]")
146
+ output_result(dataset, output)
147
+ except Exception as e:
148
+ console.print(f"[red]Error:[/red] {e}", style="bold")
149
+ raise typer.Exit(1)
150
+
151
+
152
+ @app.command("delete")
153
+ def delete_dataset(
154
+ slug: str = typer.Argument(..., help="Dataset slug"),
155
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
156
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
157
+ yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
158
+ remove_delete_protection: bool = typer.Option(
159
+ False, "--remove-delete-protection", help="Remove delete protection before deleting"
160
+ ),
161
+ ) -> None:
162
+ """Delete a dataset.
163
+
164
+ If the dataset has delete protection enabled, use --remove-delete-protection
165
+ to disable it before deleting.
166
+ """
167
+ try:
168
+ if not yes:
169
+ confirm = typer.confirm(
170
+ f"Delete dataset '{slug}' and ALL its data (triggers, SLOs, queries, events)?"
171
+ )
172
+ if not confirm:
173
+ console.print("[yellow]Cancelled[/yellow]")
174
+ raise typer.Exit(0)
175
+
176
+ client = get_client(profile=profile, api_key=api_key)
177
+
178
+ if remove_delete_protection:
179
+ console.print(f"Removing delete protection from '{slug}'...")
180
+ client.datasets.set_delete_protected(slug=slug, protected=False)
181
+
182
+ client.datasets.delete(slug=slug)
183
+ console.print(f"[green]Deleted dataset '{slug}'[/green]")
184
+ except Exception as e:
185
+ console.print(f"[red]Error:[/red] {e}", style="bold")
186
+ raise typer.Exit(1)
@@ -0,0 +1,222 @@
1
+ """
2
+ Derived column (calculated field) 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.derived_columns import DerivedColumnCreate
14
+
15
+ app = typer.Typer(help="Manage derived columns (calculated fields)")
16
+ console = Console()
17
+
18
+
19
+ @app.command("list")
20
+ def list_derived_columns(
21
+ dataset: str = typer.Option(
22
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__ for environment-wide)"
23
+ ),
24
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
25
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
26
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
27
+ quiet: bool = typer.Option(False, "--quiet", "-q", help="Only output column IDs"),
28
+ ) -> None:
29
+ """List all derived columns (environment-wide by default, or in a specific dataset)."""
30
+ try:
31
+ client = get_client(profile=profile, api_key=api_key)
32
+ columns = client.derived_columns.list(dataset=dataset)
33
+ output_result(
34
+ columns,
35
+ output,
36
+ columns=["id", "alias", "expression", "description", "created_at"],
37
+ quiet=quiet,
38
+ )
39
+ except Exception as e:
40
+ console.print(f"[red]Error:[/red] {e}", style="bold")
41
+ raise typer.Exit(1)
42
+
43
+
44
+ @app.command("get")
45
+ def get_derived_column(
46
+ column_id: str = typer.Argument(..., help="Derived column ID"),
47
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
48
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
49
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
50
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
51
+ ) -> None:
52
+ """Get a specific derived column."""
53
+ try:
54
+ client = get_client(profile=profile, api_key=api_key)
55
+ column = client.derived_columns.get(dataset=dataset, column_id=column_id)
56
+ output_result(column, output)
57
+ except Exception as e:
58
+ console.print(f"[red]Error:[/red] {e}", style="bold")
59
+ raise typer.Exit(1)
60
+
61
+
62
+ @app.command("create")
63
+ def create_derived_column(
64
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
65
+ from_file: Path = typer.Option(
66
+ ..., "--from-file", "-f", help="JSON file with derived column config"
67
+ ),
68
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
69
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
70
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
71
+ ) -> None:
72
+ """Create a derived column from a JSON file."""
73
+ try:
74
+ client = get_client(profile=profile, api_key=api_key)
75
+
76
+ # Load and parse JSON file
77
+ data = json.loads(from_file.read_text())
78
+
79
+ # Strip fields that shouldn't be in create request
80
+ data.pop("id", None)
81
+ data.pop("created_at", None)
82
+ data.pop("updated_at", None)
83
+
84
+ column_create = DerivedColumnCreate.model_validate(data)
85
+ column = client.derived_columns.create(dataset=dataset, derived_column=column_create)
86
+
87
+ console.print(
88
+ f"[green]Created derived column '{column.alias}' with ID: {column.id}[/green]"
89
+ )
90
+ output_result(column, output)
91
+ except Exception as e:
92
+ console.print(f"[red]Error:[/red] {e}", style="bold")
93
+ raise typer.Exit(1)
94
+
95
+
96
+ @app.command("update")
97
+ def update_derived_column(
98
+ column_id: str = typer.Argument(..., help="Derived column ID"),
99
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
100
+ from_file: Path = typer.Option(
101
+ ..., "--from-file", "-f", help="JSON file with derived column config"
102
+ ),
103
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
104
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
105
+ output: OutputFormat = typer.Option(DEFAULT_OUTPUT_FORMAT, "--output", "-o"),
106
+ ) -> None:
107
+ """Update an existing derived column."""
108
+ try:
109
+ client = get_client(profile=profile, api_key=api_key)
110
+
111
+ # Load and parse JSON file
112
+ data = json.loads(from_file.read_text())
113
+
114
+ # Strip fields that shouldn't be in update request
115
+ data.pop("id", None)
116
+ data.pop("created_at", None)
117
+ data.pop("updated_at", None)
118
+
119
+ column_update = DerivedColumnCreate.model_validate(data)
120
+ column = client.derived_columns.update(
121
+ dataset=dataset, column_id=column_id, derived_column=column_update
122
+ )
123
+
124
+ console.print(f"[green]Updated derived column '{column.alias}'[/green]")
125
+ output_result(column, output)
126
+ except Exception as e:
127
+ console.print(f"[red]Error:[/red] {e}", style="bold")
128
+ raise typer.Exit(1)
129
+
130
+
131
+ @app.command("delete")
132
+ def delete_derived_column(
133
+ column_id: str = typer.Argument(..., help="Derived column ID"),
134
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
135
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
136
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
137
+ yes: bool = typer.Option(False, "--yes", "-y", help="Skip confirmation"),
138
+ ) -> None:
139
+ """Delete a derived column."""
140
+ try:
141
+ if not yes:
142
+ confirm = typer.confirm(f"Delete derived column {column_id} from dataset {dataset}?")
143
+ if not confirm:
144
+ console.print("[yellow]Cancelled[/yellow]")
145
+ raise typer.Exit(0)
146
+
147
+ client = get_client(profile=profile, api_key=api_key)
148
+ client.derived_columns.delete(dataset=dataset, column_id=column_id)
149
+ console.print(f"[green]Deleted derived column {column_id}[/green]")
150
+ except Exception as e:
151
+ console.print(f"[red]Error:[/red] {e}", style="bold")
152
+ raise typer.Exit(1)
153
+
154
+
155
+ @app.command("export")
156
+ def export_derived_column(
157
+ column_id: str = typer.Argument(..., help="Derived column ID"),
158
+ dataset: str = typer.Option(..., "--dataset", "-d", help="Dataset slug"),
159
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
160
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
161
+ output_file: Path | None = typer.Option(
162
+ None, "--output-file", "-o", help="Output file (default: stdout)"
163
+ ),
164
+ ) -> None:
165
+ """
166
+ Export a derived column as JSON.
167
+
168
+ Output is suitable for importing to another environment via the 'create' command.
169
+ """
170
+ try:
171
+ client = get_client(profile=profile, api_key=api_key)
172
+ column = client.derived_columns.get(dataset=dataset, column_id=column_id)
173
+
174
+ # Export without IDs/timestamps for portability
175
+ data = column.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
176
+ json_str = json.dumps(data, indent=2, default=str)
177
+
178
+ if output_file:
179
+ output_file.write_text(json_str)
180
+ console.print(f"[green]Exported derived column to {output_file}[/green]")
181
+ else:
182
+ console.print(json_str)
183
+ except Exception as e:
184
+ console.print(f"[red]Error:[/red] {e}", style="bold")
185
+ raise typer.Exit(1)
186
+
187
+
188
+ @app.command("export-all")
189
+ def export_all_derived_columns(
190
+ dataset: str = typer.Option(
191
+ "__all__", "--dataset", "-d", help="Dataset slug (default: __all__ for environment-wide)"
192
+ ),
193
+ output_dir: Path = typer.Option(..., "--output-dir", help="Output directory"),
194
+ profile: str | None = typer.Option(None, "--profile", "-p", help="Config profile"),
195
+ api_key: str | None = typer.Option(None, "--api-key", envvar="HONEYCOMB_API_KEY"),
196
+ ) -> None:
197
+ """Export all derived columns to individual JSON files."""
198
+ try:
199
+ output_dir.mkdir(parents=True, exist_ok=True)
200
+
201
+ client = get_client(profile=profile, api_key=api_key)
202
+ columns = client.derived_columns.list(dataset=dataset)
203
+
204
+ for column in columns:
205
+ # Export without IDs/timestamps
206
+ data = column.model_dump(exclude={"id", "created_at", "updated_at"}, mode="json")
207
+
208
+ # Sanitize filename (replace special chars with dash)
209
+ filename = f"{column.alias}.json".replace("/", "-").replace(" ", "-").lower()
210
+ file_path = output_dir / filename
211
+
212
+ with open(file_path, "w") as f:
213
+ json.dump(data, f, indent=2, default=str)
214
+
215
+ console.print(f"[green]Exported '{column.alias}' to {file_path}[/green]")
216
+
217
+ console.print(
218
+ f"\n[bold green]Exported {len(columns)} derived columns to {output_dir}[/bold green]"
219
+ )
220
+ except Exception as e:
221
+ console.print(f"[red]Error:[/red] {e}", style="bold")
222
+ raise typer.Exit(1)