From 083dccc9e31d27d6c3a60c0127261ed91d7d6538 Mon Sep 17 00:00:00 2001 From: o11yguru Date: Tue, 1 Oct 2024 17:47:54 -0600 Subject: [PATCH] dynamic vars --- cmd/dynamic_vars.go | 159 +++++++++++++++++++++++ cmd/root.go | 2 + docs/md/mdai.md | 3 +- docs/md/mdai_dynamic_variable_list.md | 32 +++++ docs/md/mdai_dynamic_variables.md | 29 +++++ docs/md/mdai_dynamic_variables_add.md | 34 +++++ docs/md/mdai_dynamic_variables_remove.md | 37 ++++++ usage/prometheus_usage.md | 91 +++++++++++++ 8 files changed, 386 insertions(+), 1 deletion(-) create mode 100644 cmd/dynamic_vars.go create mode 100644 docs/md/mdai_dynamic_variable_list.md create mode 100644 docs/md/mdai_dynamic_variables.md create mode 100644 docs/md/mdai_dynamic_variables_add.md create mode 100644 docs/md/mdai_dynamic_variables_remove.md create mode 100644 usage/prometheus_usage.md diff --git a/cmd/dynamic_vars.go b/cmd/dynamic_vars.go new file mode 100644 index 0000000..ced42d5 --- /dev/null +++ b/cmd/dynamic_vars.go @@ -0,0 +1,159 @@ +package cmd + +import ( + "errors" + "fmt" + "strings" + "github.com/charmbracelet/lipgloss" + "github.com/charmbracelet/lipgloss/table" + "github.com/spf13/cobra" +) + +func NewDynamicVariablesCommand() *cobra.Command { + cmd := &cobra.Command{ + GroupID: "configuration", + Use: "dynamic_variables", + Short: "manage dynamic variables", + Long: `manage dynamic variables`, + } + + cmd.DisableFlagsInUseLine = true + cmd.SilenceUsage = true + + cmd.AddCommand( + NewDynamicVariablesAddCommand(), + NewDynamicVariablesListCommand(), + NewDynamicVariablesRemoveCommand(), + ) + + return cmd +} + +// Define DynamicVariables as a list of key-value pairs (map[string]string) +type DynamicVariables []map[string]string + +func GetMockDynamicVars() DynamicVariables { + // Initialize DynamicVariables with some key-value pairs + vars := DynamicVariables{ + {"key": "environment", "value": "production"}, + {"key": "version", "value": "1.0.0"}, + {"key": "region", "value": "us-west-1"}, + } + return vars +} + +func NewDynamicVariablesListCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "list dynamic variables", + Long: `list dynamic variables`, + RunE: func(cmd *cobra.Command, _ []string) error { + dynamicVars := GetMockDynamicVars() + + var rows [][]string + headers := []string{"Key", "Value", "Status"} + + for _, dynamicVar := range dynamicVars { + row := []string{dynamicVar["key"], dynamicVar["value"], "Enabled"} + rows = append(rows, row) + } + + printDynamicVariables := func(headers []string, rows [][]string) { + if len(rows) == 0 { + return + } + dynamicVariablesOutput := table.New(). + BorderHeader(false). + Border(lipgloss.HiddenBorder()). + StyleFunc(func(row, col int) lipgloss.Style { + switch { + case row == 0: + return HeaderStyle + default: + return lipgloss.NewStyle() + } + }). + Headers(headers...). + Rows(rows...) + fmt.Println(dynamicVariablesOutput) + } + + printDynamicVariables(headers, rows) + return nil + }, + } + + cmd.DisableFlagsInUseLine = true + cmd.SilenceUsage = true + + return cmd +} + +type dynamicVariableAddFlags struct { + key string + value string +} + + +func (f dynamicVariableAddFlags) successString() string { + var sb strings.Builder + _, _ = fmt.Fprintf(&sb, `dynamic variable added successfully as: "%s" (%s).`, f.key, f.value) + _, _ = fmt.Fprintln(&sb) + return sb.String() +} + +func NewDynamicVariablesAddCommand() *cobra.Command { + f := dynamicVariableAddFlags{} + + cmd := &cobra.Command{ + Use: "add", + Short: "add a dynamic variable", + Long: `add a dynamic variable`, + Example: ` add --key some_key --value s0m3v@lu3@5@`, + PreRunE: func(cmd *cobra.Command, _ []string) error { + cmd.MarkFlagsRequiredTogether("key", "value") + + return nil + }, + RunE: func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().NFlag() == 0 { + return errors.New(cmd.UsageString()) + } + + fmt.Println(f.successString()) + return nil + }, + } + + cmd.Flags().StringVarP(&f.key, "key", "k", "", "key of the dynamic variable") + cmd.Flags().StringVarP(&f.value, "value", "v", "", "value of the dynamic variable") + + cmd.DisableFlagsInUseLine = true + cmd.SilenceUsage = true + + return cmd +} + +func NewDynamicVariablesRemoveCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "remove", + Short: "remove a dynamic variable", + Long: `remove a dynamic variable`, + Example: ` remove --key some_key`, + RunE: func(cmd *cobra.Command, _ []string) error { + dynamicVariableKey, _ := cmd.Flags().GetString("key") + + fmt.Printf(`"%s" dynamic variable removed successfully.`, dynamicVariableKey) + fmt.Println() + return nil + }, + } + + cmd.Flags().StringP("key", "k", "", "name of the dynamic variable") + _ = cmd.MarkFlagRequired("key") + + cmd.DisableFlagsInUseLine = true + cmd.SilenceUsage = true + + return cmd +} diff --git a/cmd/root.go b/cmd/root.go index 6b04c4f..64a45b6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -128,6 +128,8 @@ func addCommands(cmd *cobra.Command) { NewStatusCommand(), NewUninstallCommand(), NewUpdateCommand(), + // THIS IS A FAKE COMMAND + NewDynamicVariablesCommand(), ) } diff --git a/docs/md/mdai.md b/docs/md/mdai.md index c4ff9a4..9700f18 100644 --- a/docs/md/mdai.md +++ b/docs/md/mdai.md @@ -39,7 +39,8 @@ MyDecisive.ai CLI ### SEE ALSO * [mdai disable](mdai_disable.md) - disable a module -* [mdai enable](mdai_enable.md) - enable a module +* [mdai enable](mdai_enable.md) - enable a module +* [mdai dynamic_variables](mdai_dynamic_variables.md) - manage dynamic variables * [mdai filter](mdai_filter.md) - telemetry filtering * [mdai get](mdai_get.md) - get a configuration * [mdai install](mdai_install.md) - install MyDecisive Cluster diff --git a/docs/md/mdai_dynamic_variable_list.md b/docs/md/mdai_dynamic_variable_list.md new file mode 100644 index 0000000..7cb090c --- /dev/null +++ b/docs/md/mdai_dynamic_variable_list.md @@ -0,0 +1,32 @@ +## mdai dynamic variables list + +list telemetry dynamic variables + +### Synopsis + +list telemetry dynamic variables + +``` +mdai dynamic variables list +``` + +### Options + +``` + -h, --help help for list + --pipeline + --service +``` + +### Options inherited from parent commands + +``` + --kubeconfig sts Path to a kubeconfig + --kubecontext string Kubernetes context to use +``` + +### SEE ALSO + +* [mdai dynamic_variables](mdai_dynamic_variables.md) - telemetry dynamic variables + +###### Auto generated by spf13/cobra on 23-Aug-2024 diff --git a/docs/md/mdai_dynamic_variables.md b/docs/md/mdai_dynamic_variables.md new file mode 100644 index 0000000..193a370 --- /dev/null +++ b/docs/md/mdai_dynamic_variables.md @@ -0,0 +1,29 @@ +## mdai dynamic_variables + +Manage dynamic variables + +### Synopsis + +Manage dynamic variables + +### Options + +``` + -h, --help help for filter +``` + +### Options inherited from parent commands + +``` + --kubeconfig string Path to a kubeconfig + --kubecontext string Kubernetes context to use +``` + +### SEE ALSO + +* [mdai](mdai.md) - MyDecisive.ai CLI +* [mdai dynamic_variables add](mdai_dynamic_variables_add.md) - add dynamic variables +* [mdai dynamic_variables list](mdai_dynamic_variables_list.md) - list dynamic variables +* [mdai dynamic_variables remove](mdai_dynamic_variables_remove.md) - remove a dynamic variables + +###### Auto generated by spf13/cobra on 23-Aug-2024 diff --git a/docs/md/mdai_dynamic_variables_add.md b/docs/md/mdai_dynamic_variables_add.md new file mode 100644 index 0000000..c7317b5 --- /dev/null +++ b/docs/md/mdai_dynamic_variables_add.md @@ -0,0 +1,34 @@ +## mdai dynamic variables add + +add dynamic variables + +``` +mdai dynamic_variables add +``` + +### Examples + +``` + add --key some_key --description some_value +``` + +### Options + +``` + -v, --value string value of the dynamic variables + -h, --help help for add + -k, --key string key of the dynamic variables +``` + +### Options inherited from parent commands + +``` + --kubeconfig string Path to a kubeconfig + --kubecontext string Kubernetes context to use +``` + +### SEE ALSO + +* [mdai dynamic_variables](mdai_dynamic variables.md) - dynamic variables + +###### Auto generated by spf13/cobra on 23-Aug-2024 diff --git a/docs/md/mdai_dynamic_variables_remove.md b/docs/md/mdai_dynamic_variables_remove.md new file mode 100644 index 0000000..ac7cb6d --- /dev/null +++ b/docs/md/mdai_dynamic_variables_remove.md @@ -0,0 +1,37 @@ +## mdai filter remove + +remove a dynamic variable + +### Synopsis + +remove a dynamic variable + +``` +mdai dynamic_variable remove +``` + +### Examples + +``` + remove --key some_key +``` + +### Options + +``` + -h, --help help for remove + -k, --key string key of the dynamic variable +``` + +### Options inherited from parent commands + +``` + --kubeconfig string Path to a kubeconfig + --kubecontext string Kubernetes context to use +``` + +### SEE ALSO + +* [mdai dynamic_variable](mdai_dynamic_variable.md) - dynamic variables + +###### Auto generated by spf13/cobra on 23-Aug-2024 diff --git a/usage/prometheus_usage.md b/usage/prometheus_usage.md new file mode 100644 index 0000000..65aa086 --- /dev/null +++ b/usage/prometheus_usage.md @@ -0,0 +1,91 @@ +# Prometheus queries + +Can be queried directly from prometheus by hitting the endpoint `http://localhost:{PROMETHEUS_PORT}/api/v1/query?query={QUERY}` for instant queries or `http://localhost:{PROMETHEUS_PORT}/api/v1/query_range?query={QUERY}` for range queries. Alternatively, you can use the Prometheus [Expression browser](https://prometheus.io/docs/visualization/browser/) to see a visualization of the data that these queries return. + +See the [Prometheus docs](https://prometheus.io/docs/prometheus/latest/querying/basics/) for information on how to modify queries. +4 + +## Analysis tab + + +All in one query [LINK TO PROMETHEUS](http://localhost:9090/graph?g0.expr=increase(%0A%20%20sum%20by%20(service_name%2C%20data_type)%20(%0A%20%20%20%20label_replace(%0A%20%20%20%20%20%20%7B__name__%3D~%22mdai_(logs%7Cspans%7Cmetrics)_sent_total%22%7D%2C%0A%20%20%20%20%20%20%22data_type%22%2C%0A%20%20%20%20%20%20%22%241%22%2C%0A%20%20%20%20%20%20%22__name__%22%2C%0A%20%20%20%20%20%20%22mdai_(logs%7Cspans%7Cmetrics)_sent_total%22%0A%20%20%20%20)%0A%20%20)%5B1d%3A%5D%0A)&g0.tab=0&g0.display_mode=lines&g0.show_exemplars=0&g0.range_input=1h&g1.expr=increase(%0A%20%20sum%20by%20(service_name%2C%20data_type)%20(%0A%20%20%20%20label_replace(%0A%20%20%20%20%20%20%7B__name__%3D~%22mdai_(logs%7Cspans%7Cmetrics)_received_total%22%7D%2C%0A%20%20%20%20%20%20%22data_type%22%2C%0A%20%20%20%20%20%20%22%241%22%2C%0A%20%20%20%20%20%20%22__name__%22%2C%0A%20%20%20%20%20%20%22mdai_(logs%7Cspans%7Cmetrics)_received_total%22%0A%20%20%20%20)%0A%20%20)%5B1d%3A%5D%0A)&g1.tab=0&g1.display_mode=lines&g1.show_exemplars=0&g1.range_input=1h&g2.expr=increase(%0A%20%20sum%20by%20(service_name%2C%20data_type)%20(%0A%20%20%20%20label_replace(%0A%20%20%20%20%20%20%7B__name__%3D~%22mdai_(log_bytes%7Cspan_bytes%7Cmetric_bytes)_received_total%22%7D%2C%0A%20%20%20%20%20%20%22data_type%22%2C%0A%20%20%20%20%20%20%22%241%22%2C%0A%20%20%20%20%20%20%22__name__%22%2C%0A%20%20%20%20%20%20%22mdai_(log_bytes%7Cspan_bytes%7Cmetric_bytes)_received_total%22%0A%20%20%20%20)%0A%20%20)%5B1d%3A%5D%0A)&g2.tab=0&g2.display_mode=lines&g2.show_exemplars=0&g2.range_input=1h&g3.expr=increase(%0A%20%20sum%20by%20(service_name%2C%20data_type)%20(%0A%20%20%20%20label_replace(%0A%20%20%20%20%20%20%7B__name__%3D~%22mdai_(log_bytes%7Cspan_bytes%7Cmetric_bytes)_sent_total%22%7D%2C%0A%20%20%20%20%20%20%22data_type%22%2C%0A%20%20%20%20%20%20%22%241%22%2C%0A%20%20%20%20%20%20%22__name__%22%2C%0A%20%20%20%20%20%20%22mdai_(log_bytes%7Cspan_bytes%7Cmetric_bytes)_sent_total%22%0A%20%20%20%20)%0A%20%20)%5B1d%3A%5D%0A)&g3.tab=0&g3.display_mode=lines&g3.show_exemplars=0&g3.range_input=1h) + +The queries below are instant queries + +#### Metrics, logs, and traces sent by service name by event count ([link to MLT in one graph]()) + + - sum(increase(mdai_logs_sent_total{}[1h])) by (service_name) + - sum(increase(mdai_spans_sent_total{}[1h])) by (service_name) + - sum(increase(mdai_metrics_sent_total{}[1h])) by (service_name) + +#### Metrics, logs, and traces received by service name by event count ([link to MLT in one graph]()) + + - sum(increase(mdai_logs_received_total{}[1h])) by (service_name) + - sum(increase(mdai_spans_received_total{}[1h])) by (service_name) + - sum(increase(mdai_metrics_received_total{}[1h])) by (service_name) + +#### Metrics, logs, and traces received by service name by packet size ([link to MLT in one graph]()) + + - sum(increase(mdai_log_bytes_received_total{}[1h])) by (service_name) + - sum(increase(mdai_span_bytes_received_total{}[1h])) by (service_name) + - sum(increase(mdai_metric_bytes_received_total{}[1h])) by (service_name) + +#### Metrics, logs, and traces sent by service name by packet size ([link to MLT in one graph]()) + + - sum(increase(mdai_log_bytes_sent_total{}[1h])) by (service_name) + - sum(increase(mdai_span_bytes_sent_total{}[1h])) by (service_name) + - sum(increase(mdai_metric_bytes_sent_total{}[1h])) by (service_name) + +## Telemetry tab + +### Sankey diagram + +The queries below are instant queries + +#### Metrics received by receiver ([link to see all queries below in one graph]()) + +- sum(increase(otelcol_receiver_accepted_metric_points{}[1d])) by (receiver) +- sum(increase(otelcol_receiver_refused_metric_points{}[1d])) by (receiver) + +#### Metrics sent by exporter ([link to see all queries below in one graph]()) + +- sum(increase(otelcol_exporter_sent_metric_points{}[1d])) by (exporter) +- sum(increase(otelcol_exporter_enqueue_failed_metric_points{}[1d])) by (exporter) +- sum(increase(otelcol_exporter_send_failed_metric_points{}[1d])) by (exporter) + +#### Traces received by receiver ([link to see all queries below in one graph]()) + +- sum(increase(otelcol_receiver_accepted_spans{}[1d])) by (receiver) +- sum(increase(otelcol_receiver_refused_spans{}[1d])) by (receiver) + +#### Traces sent by exporter ([link to see all queries below in one graph]()) + +- sum(increase(otelcol_exporter_sent_spans{}[1d])) by (exporter) +- sum(increase(otelcol_exporter_enqueue_failed_spans{}[1d])) by (exporter) +- sum(increase(otelcol_exporter_send_failed_spans{}[1d])) by (exporter) + +#### Logs received by receiver ([link to see all queries below in one graph]()) + +- sum(increase(otelcol_receiver_accepted_log_records{}[1d])) by (receiver) +- sum(increase(otelcol_receiver_refused_log_records{}[1d])) by (receiver) + +#### Logs sent by exporter ([link to see all queries below in one graph]()) + +- sum(increase(otelcol_exporter_enqueue_failed_log_records{}[1d])) by (exporter) +- sum(increase(otelcol_exporter_send_failed_log_records{}[1d])) by (exporter) +- sum(increase(otelcol_exporter_sent_log_records{}[1d])) by (exporter) + +To see all data by receiver click [here](). + +To see all data by exporter click [here](). + +### Time picker + +The queries below are range queries + +- sum(increase(otelcol_receiver_accepted_metric_points{}[1d:15m])) +- sum(increase(otelcol_receiver_accepted_log_records{}[1d:15m])) +- sum(increase(otelcol_receiver_accepted_spans{}[1d:15m])) +- sum(increase(otelcol_exporter_sent_metric_point{}[1d:15m])) +- sum(increase(otelcol_exporter_sent_log_record{}[1d:15m])) +- sum(increase(otelcol_exporter_sent_span{}[1d:15m]))