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.
- honeycomb/__init__.py +9 -0
- honeycomb/_generated/api/auth/get_auth.py +2 -5
- honeycomb/_generated/api/auth/get_v2_auth.py +2 -5
- honeycomb/_generated/api/boards/create_board.py +6 -5
- honeycomb/_generated/api/boards/create_board_view.py +14 -9
- honeycomb/_generated/api/boards/delete_board.py +2 -5
- honeycomb/_generated/api/boards/delete_board_view.py +2 -5
- honeycomb/_generated/api/boards/get_board.py +2 -5
- honeycomb/_generated/api/boards/get_board_view.py +2 -5
- honeycomb/_generated/api/boards/list_board_views.py +10 -9
- honeycomb/_generated/api/boards/list_boards.py +2 -5
- honeycomb/_generated/api/boards/update_board.py +10 -5
- honeycomb/_generated/api/boards/update_board_view.py +2 -5
- honeycomb/_generated/api/burn_alerts/create_burn_alert.py +6 -8
- honeycomb/_generated/api/burn_alerts/delete_burn_alert.py +2 -5
- honeycomb/_generated/api/burn_alerts/get_burn_alert.py +2 -5
- honeycomb/_generated/api/burn_alerts/list_burn_alerts_by_slo.py +2 -5
- honeycomb/_generated/api/calculated_fields/create_calculated_field.py +2 -5
- honeycomb/_generated/api/calculated_fields/delete_calculated_field.py +2 -5
- honeycomb/_generated/api/calculated_fields/get_calculated_field.py +2 -5
- honeycomb/_generated/api/calculated_fields/list_calculated_fields.py +2 -8
- honeycomb/_generated/api/calculated_fields/update_calculated_field.py +2 -5
- honeycomb/_generated/api/columns/create_column.py +2 -5
- honeycomb/_generated/api/columns/delete_column.py +2 -5
- honeycomb/_generated/api/columns/get_column.py +2 -5
- honeycomb/_generated/api/columns/list_columns.py +2 -8
- honeycomb/_generated/api/columns/update_column.py +2 -5
- honeycomb/_generated/api/dataset_definitions/list_dataset_definitions.py +2 -5
- honeycomb/_generated/api/dataset_definitions/patch_dataset_definitions.py +2 -5
- honeycomb/_generated/api/datasets/create_dataset.py +2 -5
- honeycomb/_generated/api/datasets/delete_dataset.py +2 -5
- honeycomb/_generated/api/datasets/get_dataset.py +2 -5
- honeycomb/_generated/api/datasets/list_datasets.py +2 -5
- honeycomb/_generated/api/datasets/update_dataset.py +2 -5
- honeycomb/_generated/api/enhance/record_enhance_indexer_usage.py +4 -6
- honeycomb/_generated/api/environments/create_environment.py +2 -5
- honeycomb/_generated/api/environments/delete_environment.py +2 -5
- honeycomb/_generated/api/environments/get_environment.py +2 -5
- honeycomb/_generated/api/environments/list_environments.py +2 -7
- honeycomb/_generated/api/environments/update_environment.py +2 -5
- honeycomb/_generated/api/events/create_event.py +2 -7
- honeycomb/_generated/api/events/create_events.py +7 -11
- honeycomb/_generated/api/key_management/create_api_key.py +2 -5
- honeycomb/_generated/api/key_management/delete_api_key.py +2 -5
- honeycomb/_generated/api/key_management/get_api_key.py +2 -5
- honeycomb/_generated/api/key_management/list_api_keys.py +2 -7
- honeycomb/_generated/api/key_management/update_api_key.py +2 -5
- honeycomb/_generated/api/kinesis_events/create_kinesis_events.py +2 -5
- honeycomb/_generated/api/marker_settings/create_marker_setting.py +2 -5
- honeycomb/_generated/api/marker_settings/delete_marker_settings.py +2 -5
- honeycomb/_generated/api/marker_settings/list_marker_settings.py +2 -5
- honeycomb/_generated/api/marker_settings/update_marker_settings.py +2 -5
- honeycomb/_generated/api/markers/create_marker.py +2 -5
- honeycomb/_generated/api/markers/create_marker_v2.py +2 -5
- honeycomb/_generated/api/markers/delete_marker.py +2 -5
- honeycomb/_generated/api/markers/get_marker.py +2 -5
- honeycomb/_generated/api/markers/update_marker.py +2 -5
- honeycomb/_generated/api/markers/update_marker_v2.py +2 -5
- honeycomb/_generated/api/pipelines/get_pipeline_configuration.py +4 -8
- honeycomb/_generated/api/pipelines/record_pipeline_usage.py +4 -6
- honeycomb/_generated/api/pipelines/update_pipeline_configuration_rollout.py +6 -7
- honeycomb/_generated/api/queries/create_query.py +2 -5
- honeycomb/_generated/api/queries/get_query.py +2 -5
- honeycomb/_generated/api/query_annotations/create_query_annotation.py +2 -5
- honeycomb/_generated/api/query_annotations/delete_query_annotation.py +2 -5
- honeycomb/_generated/api/query_annotations/get_query_annotation.py +2 -5
- honeycomb/_generated/api/query_annotations/list_query_annotations.py +2 -7
- honeycomb/_generated/api/query_annotations/update_query_annotation.py +2 -5
- honeycomb/_generated/api/query_data/create_query_result.py +2 -5
- honeycomb/_generated/api/query_data/get_query_result.py +2 -5
- honeycomb/_generated/api/recipients/create_recipient.py +2 -6
- honeycomb/_generated/api/recipients/delete_recipient.py +2 -5
- honeycomb/_generated/api/recipients/get_recipient.py +2 -6
- honeycomb/_generated/api/recipients/list_recipients.py +2 -6
- honeycomb/_generated/api/recipients/update_recipient.py +2 -6
- honeycomb/_generated/api/reporting/get_slo_history.py +2 -5
- honeycomb/_generated/api/service_maps/create_map_dependency_request.py +6 -9
- honeycomb/_generated/api/service_maps/get_map_dependencies.py +2 -7
- honeycomb/_generated/api/sl_os/create_slo.py +2 -5
- honeycomb/_generated/api/sl_os/delete_slo.py +2 -5
- honeycomb/_generated/api/sl_os/get_slo.py +2 -8
- honeycomb/_generated/api/sl_os/list_slos.py +2 -5
- honeycomb/_generated/api/sl_os/update_slo.py +2 -5
- honeycomb/_generated/api/triggers/create_trigger.py +2 -6
- honeycomb/_generated/api/triggers/delete_trigger.py +2 -5
- honeycomb/_generated/api/triggers/get_trigger.py +2 -5
- honeycomb/_generated/api/triggers/list_triggers.py +2 -5
- honeycomb/_generated/api/triggers/list_triggers_with_recipient.py +2 -5
- honeycomb/_generated/api/triggers/update_trigger.py +2 -5
- honeycomb/_generated/client.py +2 -5
- honeycomb/_generated/models/__init__.py +195 -88
- honeycomb/_generated/models/api_key_create_request.py +6 -5
- honeycomb/_generated/models/api_key_create_request_data.py +15 -11
- honeycomb/_generated/models/api_key_create_request_data_relationships.py +2 -3
- honeycomb/_generated/models/api_key_create_request_data_type.py +1 -0
- honeycomb/_generated/models/api_key_list_response.py +2 -5
- honeycomb/_generated/models/api_key_object.py +14 -14
- honeycomb/_generated/models/api_key_object_links.py +2 -9
- honeycomb/_generated/models/api_key_object_relationships.py +5 -9
- honeycomb/_generated/models/api_key_object_type.py +1 -0
- honeycomb/_generated/models/api_key_response.py +2 -3
- honeycomb/_generated/models/api_key_update_request.py +15 -17
- honeycomb/_generated/models/auth.py +2 -5
- honeycomb/_generated/models/auth_api_key_access.py +2 -9
- honeycomb/_generated/models/auth_environment.py +2 -9
- honeycomb/_generated/models/auth_team.py +2 -9
- honeycomb/_generated/models/auth_type.py +1 -0
- honeycomb/_generated/models/auth_v2_response.py +5 -8
- honeycomb/_generated/models/auth_v2_response_data.py +14 -11
- honeycomb/_generated/models/auth_v2_response_data_attributes.py +10 -9
- honeycomb/_generated/models/auth_v2_response_data_attributes_key_type.py +1 -0
- honeycomb/_generated/models/auth_v2_response_data_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/auth_v2_response_data_relationships.py +1 -7
- honeycomb/_generated/models/auth_v2_response_data_type.py +1 -0
- honeycomb/_generated/models/base_trigger.py +21 -18
- honeycomb/_generated/models/base_trigger_alert_type.py +1 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0.py +5 -9
- honeycomb/_generated/models/base_trigger_baseline_details_type_0_offset_minutes.py +1 -0
- honeycomb/_generated/models/base_trigger_baseline_details_type_0_type.py +1 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule.py +8 -6
- honeycomb/_generated/models/base_trigger_evaluation_schedule_type.py +1 -0
- honeycomb/_generated/models/base_trigger_evaluation_schedule_window.py +4 -9
- honeycomb/_generated/models/base_trigger_evaluation_schedule_window_days_of_week_item.py +1 -0
- honeycomb/_generated/models/base_trigger_threshold.py +2 -9
- honeycomb/_generated/models/base_trigger_threshold_op.py +1 -0
- honeycomb/_generated/models/batch_event.py +2 -5
- honeycomb/_generated/models/board.py +15 -17
- honeycomb/_generated/models/board_layout_generation.py +1 -0
- honeycomb/_generated/models/board_links.py +2 -9
- honeycomb/_generated/models/board_panel_position.py +2 -9
- honeycomb/_generated/models/board_query_visualization_settings.py +8 -8
- honeycomb/_generated/models/board_query_visualization_settings_charts_item.py +4 -10
- honeycomb/_generated/models/board_query_visualization_settings_charts_item_chart_type.py +1 -0
- honeycomb/_generated/models/board_type.py +1 -0
- honeycomb/_generated/models/board_view_filter.py +2 -9
- honeycomb/_generated/models/board_view_filter_operation.py +1 -0
- honeycomb/_generated/models/board_view_response.py +2 -5
- honeycomb/_generated/models/budget_rate.py +4 -12
- honeycomb/_generated/models/budget_rate_alert_type.py +1 -0
- honeycomb/_generated/models/burn_alert_shared_params.py +4 -12
- honeycomb/_generated/models/calculated_field.py +2 -9
- honeycomb/_generated/models/configuration_key_attributes.py +16 -12
- honeycomb/_generated/models/configuration_key_attributes_key_type.py +1 -0
- honeycomb/_generated/models/configuration_key_attributes_permissions.py +172 -0
- honeycomb/_generated/models/configuration_key_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/configuration_key_request.py +101 -0
- honeycomb/_generated/models/configuration_key_request_attributes.py +107 -0
- honeycomb/_generated/models/configuration_key_request_attributes_permissions.py +168 -0
- honeycomb/_generated/models/configuration_key_request_type.py +8 -0
- honeycomb/_generated/models/create_board_view_request.py +2 -3
- honeycomb/_generated/models/create_budget_rate_burn_alert_request.py +10 -10
- honeycomb/_generated/models/create_budget_rate_burn_alert_request_slo.py +1 -7
- honeycomb/_generated/models/create_column.py +2 -9
- honeycomb/_generated/models/create_column_type.py +1 -0
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data.py +10 -7
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes.py +8 -8
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
- 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
- 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
- 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
- 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
- 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
- honeycomb/_generated/models/create_enhance_indexer_usage_record_request_data_type.py +1 -0
- honeycomb/_generated/models/create_environment_request.py +8 -6
- honeycomb/_generated/models/create_environment_request_data.py +10 -7
- honeycomb/_generated/models/create_environment_request_data_attributes.py +2 -9
- honeycomb/_generated/models/create_environment_request_data_type.py +1 -0
- honeycomb/_generated/models/create_events_content_encoding.py +1 -0
- honeycomb/_generated/models/create_events_response_200_item.py +2 -9
- honeycomb/_generated/models/create_exhaustion_time_burn_alert_request.py +10 -10
- honeycomb/_generated/models/create_exhaustion_time_burn_alert_request_slo.py +1 -7
- honeycomb/_generated/models/create_map_dependencies_request.py +2 -5
- honeycomb/_generated/models/create_map_dependencies_response.py +4 -10
- honeycomb/_generated/models/create_map_dependencies_response_status.py +1 -0
- honeycomb/_generated/models/create_pipeline_health_record_request.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data.py +10 -7
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes.py +8 -8
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item.py +8 -6
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item.py +8 -8
- honeycomb/_generated/models/create_pipeline_health_record_request_data_attributes_usage_data_resource_metrics_item_scope_metrics_item_metrics_item_sum.py +10 -7
- 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
- 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
- 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
- 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
- honeycomb/_generated/models/create_pipeline_health_record_request_data_type.py +1 -0
- honeycomb/_generated/models/create_query_result_request.py +2 -9
- honeycomb/_generated/models/dataset.py +2 -6
- honeycomb/_generated/models/dataset_creation_payload.py +2 -9
- honeycomb/_generated/models/dataset_definition_type_1.py +4 -10
- honeycomb/_generated/models/dataset_definition_type_1_column_type.py +1 -0
- honeycomb/_generated/models/dataset_definitions.py +2 -6
- honeycomb/_generated/models/dataset_relationship.py +2 -3
- honeycomb/_generated/models/dataset_relationship_data.py +2 -8
- honeycomb/_generated/models/dataset_relationship_data_type.py +1 -0
- honeycomb/_generated/models/dataset_settings.py +2 -9
- honeycomb/_generated/models/dataset_update_payload.py +8 -8
- honeycomb/_generated/models/dataset_update_payload_settings.py +2 -9
- honeycomb/_generated/models/detailed_error.py +2 -9
- honeycomb/_generated/models/email_recipient.py +4 -7
- honeycomb/_generated/models/email_recipient_details.py +1 -7
- honeycomb/_generated/models/email_recipient_type.py +1 -0
- honeycomb/_generated/models/environment.py +6 -7
- honeycomb/_generated/models/environment_attributes.py +11 -9
- honeycomb/_generated/models/environment_attributes_color_type_1.py +1 -0
- honeycomb/_generated/models/environment_attributes_settings.py +1 -7
- honeycomb/_generated/models/environment_color.py +1 -0
- honeycomb/_generated/models/environment_links.py +1 -7
- honeycomb/_generated/models/environment_list_response.py +2 -5
- honeycomb/_generated/models/environment_relationship.py +8 -6
- honeycomb/_generated/models/environment_relationship_data.py +3 -8
- honeycomb/_generated/models/environment_relationship_data_type.py +1 -0
- honeycomb/_generated/models/environment_response.py +2 -3
- honeycomb/_generated/models/environment_type.py +1 -0
- honeycomb/_generated/models/error.py +2 -9
- honeycomb/_generated/models/event.py +2 -8
- honeycomb/_generated/models/exhaustion_time.py +4 -12
- honeycomb/_generated/models/exhaustion_time_alert_type.py +1 -0
- honeycomb/_generated/models/exhaustion_time_burn_alert_list_response.py +10 -10
- honeycomb/_generated/models/exhaustion_time_burn_alert_list_response_slo.py +2 -9
- honeycomb/_generated/models/filter_op.py +1 -0
- honeycomb/_generated/models/get_map_dependencies_response.py +7 -10
- honeycomb/_generated/models/get_map_dependencies_response_status.py +1 -0
- honeycomb/_generated/models/having_calculate_op.py +1 -0
- honeycomb/_generated/models/having_op.py +1 -0
- honeycomb/_generated/models/included_resource.py +6 -7
- honeycomb/_generated/models/included_resource_attributes.py +1 -7
- honeycomb/_generated/models/ingest_key_attributes.py +14 -11
- honeycomb/_generated/models/ingest_key_attributes_key_type.py +1 -0
- honeycomb/_generated/models/ingest_key_attributes_permissions.py +2 -9
- honeycomb/_generated/models/ingest_key_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/ingest_key_request.py +100 -0
- honeycomb/_generated/models/ingest_key_request_attributes.py +75 -0
- honeycomb/_generated/models/ingest_key_request_type.py +8 -0
- honeycomb/_generated/models/ingest_key_type.py +2 -9
- honeycomb/_generated/models/ingest_key_type_key_type.py +1 -0
- honeycomb/_generated/models/jsonapi_error_source.py +2 -9
- honeycomb/_generated/models/kinesis_event.py +2 -5
- honeycomb/_generated/models/kinesis_event_record.py +2 -9
- honeycomb/_generated/models/kinesis_response.py +2 -9
- honeycomb/_generated/models/list_api_keys_filtertype.py +1 -0
- honeycomb/_generated/models/map_dependency.py +2 -5
- honeycomb/_generated/models/map_node.py +2 -9
- honeycomb/_generated/models/map_node_type.py +1 -0
- honeycomb/_generated/models/marker.py +2 -9
- honeycomb/_generated/models/marker_create_request.py +2 -3
- honeycomb/_generated/models/marker_create_request_data.py +16 -10
- honeycomb/_generated/models/marker_create_request_data_attributes.py +2 -9
- honeycomb/_generated/models/marker_create_request_data_relationships.py +2 -3
- honeycomb/_generated/models/marker_create_request_data_type.py +1 -0
- honeycomb/_generated/models/marker_object.py +7 -8
- honeycomb/_generated/models/marker_object_attributes.py +8 -8
- honeycomb/_generated/models/marker_object_attributes_timestamps.py +4 -12
- honeycomb/_generated/models/marker_object_links.py +2 -9
- honeycomb/_generated/models/marker_object_relationships.py +8 -8
- honeycomb/_generated/models/marker_object_relationships_dataset.py +8 -9
- honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0.py +4 -10
- honeycomb/_generated/models/marker_object_relationships_dataset_data_type_0_type.py +1 -0
- honeycomb/_generated/models/marker_object_type.py +1 -0
- honeycomb/_generated/models/marker_response.py +2 -3
- honeycomb/_generated/models/marker_setting.py +2 -10
- honeycomb/_generated/models/marker_update_request.py +2 -3
- honeycomb/_generated/models/marker_update_request_data.py +16 -10
- honeycomb/_generated/models/marker_update_request_data_attributes.py +2 -9
- honeycomb/_generated/models/marker_update_request_data_relationships.py +2 -3
- honeycomb/_generated/models/marker_update_request_data_type.py +1 -0
- honeycomb/_generated/models/ms_teams_recipient.py +4 -7
- honeycomb/_generated/models/ms_teams_recipient_details.py +1 -7
- honeycomb/_generated/models/ms_teams_recipient_type.py +1 -0
- honeycomb/_generated/models/ms_teams_workflow_recipient.py +12 -11
- honeycomb/_generated/models/ms_teams_workflow_recipient_details.py +1 -7
- honeycomb/_generated/models/ms_teams_workflow_recipient_type.py +1 -0
- honeycomb/_generated/models/notification_recipient.py +8 -8
- honeycomb/_generated/models/notification_recipient_details.py +10 -9
- honeycomb/_generated/models/notification_recipient_details_pagerduty_severity.py +1 -0
- honeycomb/_generated/models/notification_recipient_details_variables_item.py +2 -9
- honeycomb/_generated/models/pager_duty_recipient.py +8 -9
- honeycomb/_generated/models/pager_duty_recipient_details.py +1 -7
- honeycomb/_generated/models/pager_duty_recipient_type.py +1 -0
- honeycomb/_generated/models/pagination_links.py +2 -8
- honeycomb/_generated/models/payload_template.py +2 -9
- honeycomb/_generated/models/pipeline_configuration_response.py +16 -10
- honeycomb/_generated/models/pipeline_configuration_response_attributes.py +8 -8
- honeycomb/_generated/models/pipeline_configuration_response_attributes_configs_item.py +1 -7
- honeycomb/_generated/models/pipeline_configuration_response_links.py +2 -9
- honeycomb/_generated/models/pipeline_configuration_response_type.py +1 -0
- honeycomb/_generated/models/pipeline_configuration_rollout.py +16 -10
- honeycomb/_generated/models/pipeline_configuration_rollout_attributes.py +3 -8
- honeycomb/_generated/models/pipeline_configuration_rollout_attributes_status.py +1 -0
- honeycomb/_generated/models/pipeline_configuration_rollout_links.py +2 -9
- honeycomb/_generated/models/pipeline_configuration_rollout_type.py +1 -0
- honeycomb/_generated/models/preset_filter.py +1 -7
- honeycomb/_generated/models/query.py +11 -11
- honeycomb/_generated/models/query_annotation.py +4 -12
- honeycomb/_generated/models/query_annotation_source.py +1 -0
- honeycomb/_generated/models/query_calculated_fields_item.py +1 -7
- honeycomb/_generated/models/query_calculations_item.py +2 -10
- honeycomb/_generated/models/query_compare_time_offset_seconds.py +1 -0
- honeycomb/_generated/models/query_filter_combination.py +1 -0
- honeycomb/_generated/models/query_filters_item.py +2 -11
- honeycomb/_generated/models/query_havings_item.py +2 -10
- honeycomb/_generated/models/query_op.py +1 -0
- honeycomb/_generated/models/query_orders_item.py +2 -9
- honeycomb/_generated/models/query_orders_item_order.py +1 -0
- honeycomb/_generated/models/query_panel.py +2 -6
- honeycomb/_generated/models/query_panel_query_panel.py +10 -9
- honeycomb/_generated/models/query_panel_query_panel_query_style.py +1 -0
- honeycomb/_generated/models/query_result.py +2 -5
- honeycomb/_generated/models/query_result_details.py +5 -8
- honeycomb/_generated/models/query_result_details_data.py +5 -8
- honeycomb/_generated/models/query_result_details_links.py +2 -9
- honeycomb/_generated/models/query_result_links.py +2 -9
- honeycomb/_generated/models/query_results_data.py +2 -5
- honeycomb/_generated/models/query_results_data_data.py +2 -8
- honeycomb/_generated/models/query_results_series.py +2 -5
- honeycomb/_generated/models/recipient_properties.py +4 -12
- honeycomb/_generated/models/recipient_type.py +1 -0
- honeycomb/_generated/models/slack_recipient.py +4 -7
- honeycomb/_generated/models/slack_recipient_details.py +1 -7
- honeycomb/_generated/models/slack_recipient_type.py +1 -0
- honeycomb/_generated/models/slo.py +4 -8
- honeycomb/_generated/models/slo_create.py +4 -8
- honeycomb/_generated/models/slo_create_sli.py +1 -7
- honeycomb/_generated/models/slo_detailed_response.py +4 -8
- honeycomb/_generated/models/slo_detailed_response_status.py +1 -0
- honeycomb/_generated/models/slo_history.py +2 -9
- honeycomb/_generated/models/slo_history_request.py +2 -8
- honeycomb/_generated/models/slo_history_response.py +2 -3
- honeycomb/_generated/models/slo_panel.py +2 -6
- honeycomb/_generated/models/slo_panel_slo_panel.py +2 -9
- honeycomb/_generated/models/slo_sli.py +1 -7
- honeycomb/_generated/models/tag.py +1 -7
- honeycomb/_generated/models/team_relationship.py +2 -3
- honeycomb/_generated/models/team_relationship_team.py +6 -5
- honeycomb/_generated/models/team_relationship_team_data.py +3 -8
- honeycomb/_generated/models/team_relationship_team_data_type.py +1 -0
- honeycomb/_generated/models/template_variable_definition.py +2 -9
- honeycomb/_generated/models/text_panel.py +2 -6
- honeycomb/_generated/models/text_panel_text_panel.py +1 -7
- honeycomb/_generated/models/trigger_response.py +27 -21
- honeycomb/_generated/models/trigger_with_inline_query.py +27 -21
- honeycomb/_generated/models/trigger_with_inline_query_query.py +1 -7
- honeycomb/_generated/models/trigger_with_query_reference.py +21 -18
- honeycomb/_generated/models/update_board_view_request.py +2 -5
- honeycomb/_generated/models/update_environment_request.py +8 -6
- honeycomb/_generated/models/update_environment_request_data.py +10 -7
- honeycomb/_generated/models/update_environment_request_data_attributes.py +8 -8
- honeycomb/_generated/models/update_environment_request_data_attributes_settings.py +2 -9
- honeycomb/_generated/models/update_environment_request_data_type.py +1 -0
- honeycomb/_generated/models/update_exhaustion_time_burn_alert_request.py +4 -7
- honeycomb/_generated/models/update_pipeline_configuration_rollout.py +10 -7
- honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes.py +3 -8
- honeycomb/_generated/models/update_pipeline_configuration_rollout_attributes_status.py +1 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request.py +8 -6
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data.py +10 -7
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes.py +3 -8
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_attributes_status.py +1 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_request_data_type.py +1 -0
- honeycomb/_generated/models/update_pipeline_configuration_rollout_response.py +8 -6
- honeycomb/_generated/models/update_pipeline_configuration_rollout_type.py +1 -0
- honeycomb/_generated/models/user_relationship.py +2 -3
- honeycomb/_generated/models/user_relationship_data.py +2 -8
- honeycomb/_generated/models/user_relationship_data_type.py +1 -0
- honeycomb/_generated/models/validation_error.py +8 -8
- honeycomb/_generated/models/validation_error_type_detail_item.py +4 -10
- honeycomb/_generated/models/validation_error_type_detail_item_code.py +1 -0
- honeycomb/_generated/models/webhook_header.py +2 -9
- honeycomb/_generated/models/webhook_recipient.py +4 -7
- honeycomb/_generated/models/webhook_recipient_details.py +8 -8
- honeycomb/_generated/models/webhook_recipient_details_webhook_payloads.py +12 -10
- honeycomb/_generated/models/webhook_recipient_details_webhook_payloads_payload_templates.py +2 -5
- honeycomb/_generated/models/webhook_recipient_type.py +1 -0
- honeycomb/_generated/types.py +1 -1
- honeycomb/cli/__init__.py +85 -0
- honeycomb/cli/api_keys.py +205 -0
- honeycomb/cli/auth.py +70 -0
- honeycomb/cli/boards.py +203 -0
- honeycomb/cli/columns.py +256 -0
- honeycomb/cli/config.py +259 -0
- honeycomb/cli/datasets.py +186 -0
- honeycomb/cli/derived_columns.py +222 -0
- honeycomb/cli/environments.py +240 -0
- honeycomb/cli/formatters.py +242 -0
- honeycomb/cli/markers.py +151 -0
- honeycomb/cli/queries.py +380 -0
- honeycomb/cli/recipients.py +211 -0
- honeycomb/cli/slos.py +338 -0
- honeycomb/cli/triggers.py +271 -0
- honeycomb/client.py +13 -7
- honeycomb/models/__init__.py +18 -3
- honeycomb/models/api_keys.py +49 -5
- honeycomb/models/auth.py +71 -0
- honeycomb/models/board_builder.py +97 -25
- honeycomb/models/boards.py +95 -1
- honeycomb/models/datasets.py +42 -0
- honeycomb/models/queries.py +21 -0
- honeycomb/models/query_builder.py +119 -59
- honeycomb/models/recipient_builder.py +51 -4
- honeycomb/models/slo_builder.py +24 -19
- honeycomb/models/slos.py +50 -3
- honeycomb/models/tool_inputs.py +630 -0
- honeycomb/models/triggers.py +39 -9
- honeycomb/resources/__init__.py +2 -0
- honeycomb/resources/api_keys.py +66 -29
- honeycomb/resources/auth.py +97 -0
- honeycomb/resources/boards.py +272 -18
- honeycomb/resources/datasets.py +49 -11
- honeycomb/resources/environments.py +54 -31
- honeycomb/resources/slos.py +87 -61
- honeycomb/tools/__main__.py +40 -4
- honeycomb/tools/builders.py +235 -150
- honeycomb/tools/descriptions.py +175 -7
- honeycomb/tools/executor.py +212 -25
- honeycomb/tools/generator.py +61 -2264
- honeycomb/tools/resources/__init__.py +42 -0
- honeycomb/tools/resources/api_keys.py +249 -0
- honeycomb/tools/resources/auth.py +98 -0
- honeycomb/tools/resources/boards.py +313 -0
- honeycomb/tools/resources/burn_alerts.py +278 -0
- honeycomb/tools/resources/columns.py +257 -0
- honeycomb/tools/resources/datasets.py +215 -0
- honeycomb/tools/resources/derived_columns.py +311 -0
- honeycomb/tools/resources/environments.py +211 -0
- honeycomb/tools/resources/events.py +158 -0
- honeycomb/tools/resources/marker_settings.py +216 -0
- honeycomb/tools/resources/markers.py +197 -0
- honeycomb/tools/resources/queries.py +220 -0
- honeycomb/tools/resources/recipients.py +297 -0
- honeycomb/tools/resources/service_map.py +110 -0
- honeycomb/tools/resources/slos.py +276 -0
- honeycomb/tools/resources/triggers.py +328 -0
- honeycomb/tools/schemas.py +81 -0
- {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/METADATA +33 -8
- honeycomb_api-0.5.3.dist-info/RECORD +497 -0
- honeycomb_api-0.5.3.dist-info/entry_points.txt +5 -0
- honeycomb_api-0.1.0.dist-info/RECORD +0 -453
- {honeycomb_api-0.1.0.dist-info → honeycomb_api-0.5.3.dist-info}/WHEEL +0 -0
- {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]")
|
honeycomb/cli/markers.py
ADDED
|
@@ -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)
|