mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
784 lines
29 KiB
Go
784 lines
29 KiB
Go
/*
|
|
* Datadog API for Go
|
|
*
|
|
* Please see the included LICENSE file for licensing information.
|
|
*
|
|
* Copyright 2019 by authors and contributors.
|
|
*/
|
|
|
|
package datadog
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
const (
|
|
ALERT_GRAPH_WIDGET = "alert_graph"
|
|
ALERT_VALUE_WIDGET = "alert_value"
|
|
CHANGE_WIDGET = "change"
|
|
CHECK_STATUS_WIDGET = "check_status"
|
|
DISTRIBUTION_WIDGET = "distribution"
|
|
EVENT_STREAM_WIDGET = "event_stream"
|
|
EVENT_TIMELINE_WIDGET = "event_timeline"
|
|
FREE_TEXT_WIDGET = "free_text"
|
|
GROUP_WIDGET = "group"
|
|
HEATMAP_WIDGET = "heatmap"
|
|
HOSTMAP_WIDGET = "hostmap"
|
|
IFRAME_WIDGET = "iframe"
|
|
IMAGE_WIDGET = "image"
|
|
LOG_STREAM_WIDGET = "log_stream"
|
|
MANAGE_STATUS_WIDGET = "manage_status"
|
|
NOTE_WIDGET = "note"
|
|
QUERY_VALUE_WIDGET = "query_value"
|
|
QUERY_TABLE_WIDGET = "query_table"
|
|
SCATTERPLOT_WIDGET = "scatterplot"
|
|
SERVICE_LEVEL_OBJECTIVE_WIDGET = "slo"
|
|
TIMESERIES_WIDGET = "timeseries"
|
|
TOPLIST_WIDGET = "toplist"
|
|
TRACE_SERVICE_WIDGET = "trace_service"
|
|
)
|
|
|
|
// BoardWidget represents the structure of any widget. However, the widget Definition structure is
|
|
// different according to widget type.
|
|
type BoardWidget struct {
|
|
Definition interface{} `json:"definition"`
|
|
Id *int `json:"id,omitempty"`
|
|
Layout *WidgetLayout `json:"layout,omitempty"`
|
|
}
|
|
|
|
// WidgetLayout represents the layout for a widget on a "free" dashboard
|
|
type WidgetLayout struct {
|
|
X *float64 `json:"x,omitempty"`
|
|
Y *float64 `json:"y,omitempty"`
|
|
Height *float64 `json:"height,omitempty"`
|
|
Width *float64 `json:"width,omitempty"`
|
|
}
|
|
|
|
func (widget *BoardWidget) GetWidgetType() (string, error) {
|
|
switch widget.Definition.(type) {
|
|
case AlertGraphDefinition:
|
|
return ALERT_GRAPH_WIDGET, nil
|
|
case AlertValueDefinition:
|
|
return ALERT_VALUE_WIDGET, nil
|
|
case ChangeDefinition:
|
|
return CHANGE_WIDGET, nil
|
|
case CheckStatusDefinition:
|
|
return CHECK_STATUS_WIDGET, nil
|
|
case DistributionDefinition:
|
|
return DISTRIBUTION_WIDGET, nil
|
|
case EventStreamDefinition:
|
|
return EVENT_STREAM_WIDGET, nil
|
|
case EventTimelineDefinition:
|
|
return EVENT_TIMELINE_WIDGET, nil
|
|
case FreeTextDefinition:
|
|
return FREE_TEXT_WIDGET, nil
|
|
case GroupDefinition:
|
|
return GROUP_WIDGET, nil
|
|
case HeatmapDefinition:
|
|
return HEATMAP_WIDGET, nil
|
|
case HostmapDefinition:
|
|
return HOSTMAP_WIDGET, nil
|
|
case IframeDefinition:
|
|
return IFRAME_WIDGET, nil
|
|
case ImageDefinition:
|
|
return IMAGE_WIDGET, nil
|
|
case LogStreamDefinition:
|
|
return LOG_STREAM_WIDGET, nil
|
|
case ManageStatusDefinition:
|
|
return MANAGE_STATUS_WIDGET, nil
|
|
case NoteDefinition:
|
|
return NOTE_WIDGET, nil
|
|
case QueryValueDefinition:
|
|
return QUERY_VALUE_WIDGET, nil
|
|
case QueryTableDefinition:
|
|
return QUERY_TABLE_WIDGET, nil
|
|
case ScatterplotDefinition:
|
|
return SCATTERPLOT_WIDGET, nil
|
|
case ServiceLevelObjectiveDefinition:
|
|
return SERVICE_LEVEL_OBJECTIVE_WIDGET, nil
|
|
case TimeseriesDefinition:
|
|
return TIMESERIES_WIDGET, nil
|
|
case ToplistDefinition:
|
|
return TOPLIST_WIDGET, nil
|
|
case TraceServiceDefinition:
|
|
return TRACE_SERVICE_WIDGET, nil
|
|
default:
|
|
return "", fmt.Errorf("Unsupported widget type")
|
|
}
|
|
}
|
|
|
|
// AlertGraphDefinition represents the definition for an Alert Graph widget
|
|
type AlertGraphDefinition struct {
|
|
Type *string `json:"type"`
|
|
AlertId *string `json:"alert_id"`
|
|
VizType *string `json:"viz_type"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
|
|
// AlertValueDefinition represents the definition for an Alert Value widget
|
|
type AlertValueDefinition struct {
|
|
Type *string `json:"type"`
|
|
AlertId *string `json:"alert_id"`
|
|
Precision *int `json:"precision,omitempty"`
|
|
Unit *string `json:"unit,omitempty"`
|
|
TextAlign *string `json:"text_align,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
}
|
|
|
|
// ChangeDefinition represents the definition for a Change widget
|
|
type ChangeDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []ChangeRequest `json:"requests"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type ChangeRequest struct {
|
|
ChangeType *string `json:"change_type,omitempty"`
|
|
CompareTo *string `json:"compare_to,omitempty"`
|
|
IncreaseGood *bool `json:"increase_good,omitempty"`
|
|
OrderBy *string `json:"order_by,omitempty"`
|
|
OrderDir *string `json:"order_dir,omitempty"`
|
|
ShowPresent *bool `json:"show_present,omitempty"`
|
|
// A ChangeRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// CheckStatusDefinition represents the definition for a Check Status widget
|
|
type CheckStatusDefinition struct {
|
|
Type *string `json:"type"`
|
|
Check *string `json:"check"`
|
|
Grouping *string `json:"grouping"`
|
|
Group *string `json:"group,omitempty"`
|
|
GroupBy []string `json:"group_by,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
|
|
// DistributionDefinition represents the definition for a Distribution widget
|
|
type DistributionDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []DistributionRequest `json:"requests"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type DistributionRequest struct {
|
|
Style *WidgetRequestStyle `json:"style,omitempty"`
|
|
// A DistributionRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// EventStreamDefinition represents the definition for an Event Stream widget
|
|
type EventStreamDefinition struct {
|
|
Type *string `json:"type"`
|
|
Query *string `json:"query"`
|
|
EventSize *string `json:"event_size,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
|
|
// EventTimelineDefinition represents the definition for an Event Timeline widget
|
|
type EventTimelineDefinition struct {
|
|
Type *string `json:"type"`
|
|
Query *string `json:"query"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
|
|
// FreeTextDefinition represents the definition for a Free Text widget
|
|
type FreeTextDefinition struct {
|
|
Type *string `json:"type"`
|
|
Text *string `json:"text"`
|
|
Color *string `json:"color,omitempty"`
|
|
FontSize *string `json:"font_size,omitempty"`
|
|
TextAlign *string `json:"text_align,omitempty"`
|
|
}
|
|
|
|
// GroupDefinition represents the definition for an Group widget
|
|
type GroupDefinition struct {
|
|
Type *string `json:"type"`
|
|
LayoutType *string `json:"layout_type"`
|
|
Widgets []BoardWidget `json:"widgets"`
|
|
Title *string `json:"title,omitempty"`
|
|
}
|
|
|
|
// HeatmapDefinition represents the definition for a Heatmap widget
|
|
type HeatmapDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []HeatmapRequest `json:"requests"`
|
|
Yaxis *WidgetAxis `json:"yaxis,omitempty"`
|
|
Events []WidgetEvent `json:"events,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type HeatmapRequest struct {
|
|
Style *WidgetRequestStyle `json:"style,omitempty"`
|
|
// A HeatmapRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// HostmapDefinition represents the definition for a Hostmap widget
|
|
type HostmapDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests *HostmapRequests `json:"requests"`
|
|
NodeType *string `json:"node_type,omitempty"`
|
|
NoMetricHosts *bool `json:"no_metric_hosts,omitempty"`
|
|
NoGroupHosts *bool `json:"no_group_hosts,omitempty"`
|
|
Group []string `json:"group,omitempty"`
|
|
Scope []string `json:"scope,omitempty"`
|
|
Style *HostmapStyle `json:"style,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
}
|
|
type HostmapRequests struct {
|
|
Fill *HostmapRequest `json:"fill,omitempty"`
|
|
Size *HostmapRequest `json:"size,omitempty"`
|
|
}
|
|
type HostmapRequest struct {
|
|
// A HostmapRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
type HostmapStyle struct {
|
|
Palette *string `json:"palette,omitempty"`
|
|
PaletteFlip *bool `json:"palette_flip,omitempty"`
|
|
FillMin *string `json:"fill_min,omitempty"`
|
|
FillMax *string `json:"fill_max,omitempty"`
|
|
}
|
|
|
|
// IframeDefinition represents the definition for an Iframe widget
|
|
type IframeDefinition struct {
|
|
Type *string `json:"type"`
|
|
Url *string `json:"url"`
|
|
}
|
|
|
|
// ImageDefinition represents the definition for an Image widget
|
|
type ImageDefinition struct {
|
|
Type *string `json:"type"`
|
|
Url *string `json:"url"`
|
|
Sizing *string `json:"sizing,omitempty"`
|
|
Margin *string `json:"margin,omitempty"`
|
|
}
|
|
|
|
// LogStreamDefinition represents the definition for a Log Stream widget
|
|
type LogStreamDefinition struct {
|
|
Type *string `json:"type"`
|
|
Logset *string `json:"logset"`
|
|
Query *string `json:"query,omitempty"`
|
|
Columns []string `json:"columns,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
|
|
// ManageStatusDefinition represents the definition for a Manage Status widget
|
|
type ManageStatusDefinition struct {
|
|
Type *string `json:"type"`
|
|
Query *string `json:"query"`
|
|
Sort *string `json:"sort,omitempty"`
|
|
Count *int `json:"count,omitempty"`
|
|
Start *int `json:"start,omitempty"`
|
|
DisplayFormat *string `json:"display_format,omitempty"`
|
|
ColorPreference *string `json:"color_preference,omitempty"`
|
|
HideZeroCounts *bool `json:"hide_zero_counts,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
}
|
|
|
|
// NoteDefinition represents the definition for a Note widget
|
|
type NoteDefinition struct {
|
|
Type *string `json:"type"`
|
|
Content *string `json:"content"`
|
|
BackgroundColor *string `json:"background_color,omitempty"`
|
|
FontSize *string `json:"font_size,omitempty"`
|
|
TextAlign *string `json:"text_align,omitempty"`
|
|
ShowTick *bool `json:"show_tick,omitempty"`
|
|
TickPos *string `json:"tick_pos,omitempty"`
|
|
TickEdge *string `json:"tick_edge,omitempty"`
|
|
}
|
|
|
|
// QueryValueDefinition represents the definition for a Query Value widget
|
|
type QueryValueDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []QueryValueRequest `json:"requests"`
|
|
Autoscale *bool `json:"autoscale,omitempty"`
|
|
CustomUnit *string `json:"custom_unit,omitempty"`
|
|
Precision *int `json:"precision,omitempty"`
|
|
TextAlign *string `json:"text_align,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type QueryValueRequest struct {
|
|
ConditionalFormats []WidgetConditionalFormat `json:"conditional_formats,omitempty"`
|
|
Aggregator *string `json:"aggregator,omitempty"`
|
|
// A QueryValueRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// QueryTableDefinition represents the definition for a Table widget
|
|
type QueryTableDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []QueryTableRequest `json:"requests"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type QueryTableRequest struct {
|
|
Alias *string `json:"alias,omitempty"`
|
|
ConditionalFormats []WidgetConditionalFormat `json:"conditional_formats,omitempty"`
|
|
Aggregator *string `json:"aggregator,omitempty"`
|
|
Limit *int `json:"limit,omitempty"`
|
|
Order *string `json:"order,omitempty"`
|
|
// A QueryTableRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// ScatterplotDefinition represents the definition for a Scatterplot widget
|
|
type ScatterplotDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests *ScatterplotRequests `json:"requests"`
|
|
Xaxis *WidgetAxis `json:"xaxis,omitempty"`
|
|
Yaxis *WidgetAxis `json:"yaxis,omitempty"`
|
|
ColorByGroups []string `json:"color_by_groups,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type ScatterplotRequests struct {
|
|
X *ScatterplotRequest `json:"x"`
|
|
Y *ScatterplotRequest `json:"y"`
|
|
}
|
|
type ScatterplotRequest struct {
|
|
Aggregator *string `json:"aggregator,omitempty"`
|
|
// A ScatterplotRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// ServiceLevelObjectiveDefinition represents the definition for a Service Level Objective widget
|
|
type ServiceLevelObjectiveDefinition struct {
|
|
// Common
|
|
|
|
Type *string `json:"type"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
|
|
// SLO specific
|
|
ViewType *string `json:"view_type,omitempty"` // currently only "detail" is supported
|
|
ServiceLevelObjectiveID *string `json:"slo_id,omitempty"`
|
|
ShowErrorBudget *bool `json:"show_error_budget,omitempty"`
|
|
ViewMode *string `json:"view_mode,omitempty"` // overall,component,both
|
|
TimeWindows []string `json:"time_windows,omitempty"` // 7d,30d,90d,week_to_date,previous_week,month_to_date,previous_month
|
|
}
|
|
|
|
// TimeseriesDefinition represents the definition for a Timeseries widget
|
|
type TimeseriesDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []TimeseriesRequest `json:"requests"`
|
|
Yaxis *WidgetAxis `json:"yaxis,omitempty"`
|
|
Events []WidgetEvent `json:"events,omitempty"`
|
|
Markers []WidgetMarker `json:"markers,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
ShowLegend *bool `json:"show_legend,omitempty"`
|
|
LegendSize *string `json:"legend_size,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type TimeseriesRequest struct {
|
|
Style *TimeseriesRequestStyle `json:"style,omitempty"`
|
|
Metadata []WidgetMetadata `json:"metadata,omitempty"`
|
|
DisplayType *string `json:"display_type,omitempty"`
|
|
// A TimeseriesRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
type TimeseriesRequestStyle struct {
|
|
Palette *string `json:"palette,omitempty"`
|
|
LineType *string `json:"line_type,omitempty"`
|
|
LineWidth *string `json:"line_width,omitempty"`
|
|
}
|
|
|
|
// ToplistDefinition represents the definition for a Top list widget
|
|
type ToplistDefinition struct {
|
|
Type *string `json:"type"`
|
|
Requests []ToplistRequest `json:"requests"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
type ToplistRequest struct {
|
|
ConditionalFormats []WidgetConditionalFormat `json:"conditional_formats,omitempty"`
|
|
Style *WidgetRequestStyle `json:"style,omitempty"`
|
|
// A ToplistRequest should implement exactly one of the following query types
|
|
MetricQuery *string `json:"q,omitempty"`
|
|
ApmQuery *WidgetApmOrLogQuery `json:"apm_query,omitempty"`
|
|
LogQuery *WidgetApmOrLogQuery `json:"log_query,omitempty"`
|
|
ProcessQuery *WidgetProcessQuery `json:"process_query,omitempty"`
|
|
}
|
|
|
|
// TraceServiceDefinition represents the definition for a Trace Service widget
|
|
type TraceServiceDefinition struct {
|
|
Type *string `json:"type"`
|
|
Env *string `json:"env"`
|
|
Service *string `json:"service"`
|
|
SpanName *string `json:"span_name"`
|
|
ShowHits *bool `json:"show_hits,omitempty"`
|
|
ShowErrors *bool `json:"show_errors,omitempty"`
|
|
ShowLatency *bool `json:"show_latency,omitempty"`
|
|
ShowBreakdown *bool `json:"show_breakdown,omitempty"`
|
|
ShowDistribution *bool `json:"show_distribution,omitempty"`
|
|
ShowResourceList *bool `json:"show_resource_list,omitempty"`
|
|
SizeFormat *string `json:"size_format,omitempty"`
|
|
DisplayFormat *string `json:"display_format,omitempty"`
|
|
Title *string `json:"title,omitempty"`
|
|
TitleSize *string `json:"title_size,omitempty"`
|
|
TitleAlign *string `json:"title_align,omitempty"`
|
|
Time *WidgetTime `json:"time,omitempty"`
|
|
}
|
|
|
|
// UnmarshalJSON is a Custom Unmarshal for BoardWidget. If first tries to unmarshal the data in a light
|
|
// struct that allows to get the widget type. Then based on the widget type, it will try to unmarshal the
|
|
// data using the corresponding widget struct.
|
|
func (widget *BoardWidget) UnmarshalJSON(data []byte) error {
|
|
var widgetHandler struct {
|
|
Definition *struct {
|
|
Type *string `json:"type"`
|
|
} `json:"definition"`
|
|
Id *int `json:"id,omitempty"`
|
|
Layout *WidgetLayout `json:"layout,omitempty"`
|
|
}
|
|
if err := json.Unmarshal(data, &widgetHandler); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Get the widget id
|
|
widget.Id = widgetHandler.Id
|
|
|
|
// Get the widget layout
|
|
widget.Layout = widgetHandler.Layout
|
|
|
|
// Get the widget definition based on the widget type
|
|
switch *widgetHandler.Definition.Type {
|
|
case ALERT_GRAPH_WIDGET:
|
|
var alertGraphWidget struct {
|
|
Definition AlertGraphDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &alertGraphWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = alertGraphWidget.Definition
|
|
case ALERT_VALUE_WIDGET:
|
|
var alertValueWidget struct {
|
|
Definition AlertValueDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &alertValueWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = alertValueWidget.Definition
|
|
case CHANGE_WIDGET:
|
|
var changeWidget struct {
|
|
Definition ChangeDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &changeWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = changeWidget.Definition
|
|
case CHECK_STATUS_WIDGET:
|
|
var checkStatusWidget struct {
|
|
Definition CheckStatusDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &checkStatusWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = checkStatusWidget.Definition
|
|
case DISTRIBUTION_WIDGET:
|
|
var distributionWidget struct {
|
|
Definition DistributionDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &distributionWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = distributionWidget.Definition
|
|
case EVENT_STREAM_WIDGET:
|
|
var eventStreamWidget struct {
|
|
Definition EventStreamDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &eventStreamWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = eventStreamWidget.Definition
|
|
case EVENT_TIMELINE_WIDGET:
|
|
var eventTimelineWidget struct {
|
|
Definition EventTimelineDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &eventTimelineWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = eventTimelineWidget.Definition
|
|
case FREE_TEXT_WIDGET:
|
|
var freeTextWidget struct {
|
|
Definition FreeTextDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &freeTextWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = freeTextWidget.Definition
|
|
case GROUP_WIDGET:
|
|
var groupWidget struct {
|
|
Definition GroupDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &groupWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = groupWidget.Definition
|
|
case HEATMAP_WIDGET:
|
|
var heatmapWidget struct {
|
|
Definition HeatmapDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &heatmapWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = heatmapWidget.Definition
|
|
case HOSTMAP_WIDGET:
|
|
var hostmapWidget struct {
|
|
Definition HostmapDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &hostmapWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = hostmapWidget.Definition
|
|
case IFRAME_WIDGET:
|
|
var iframeWidget struct {
|
|
Definition IframeDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &iframeWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = iframeWidget.Definition
|
|
case IMAGE_WIDGET:
|
|
var imageWidget struct {
|
|
Definition ImageDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &imageWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = imageWidget.Definition
|
|
case LOG_STREAM_WIDGET:
|
|
var logStreamWidget struct {
|
|
Definition LogStreamDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &logStreamWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = logStreamWidget.Definition
|
|
case MANAGE_STATUS_WIDGET:
|
|
var manageStatusWidget struct {
|
|
Definition ManageStatusDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &manageStatusWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = manageStatusWidget.Definition
|
|
case NOTE_WIDGET:
|
|
var noteWidget struct {
|
|
Definition NoteDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, ¬eWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = noteWidget.Definition
|
|
case QUERY_VALUE_WIDGET:
|
|
var queryValueWidget struct {
|
|
Definition QueryValueDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &queryValueWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = queryValueWidget.Definition
|
|
case QUERY_TABLE_WIDGET:
|
|
var queryTableWidget struct {
|
|
Definition QueryTableDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &queryTableWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = queryTableWidget.Definition
|
|
case SCATTERPLOT_WIDGET:
|
|
var scatterplotWidget struct {
|
|
Definition ScatterplotDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &scatterplotWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = scatterplotWidget.Definition
|
|
case SERVICE_LEVEL_OBJECTIVE_WIDGET:
|
|
var serviceLevelObjectiveWidget struct {
|
|
Definition ServiceLevelObjectiveDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &serviceLevelObjectiveWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = serviceLevelObjectiveWidget.Definition
|
|
case TIMESERIES_WIDGET:
|
|
var timeseriesWidget struct {
|
|
Definition TimeseriesDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, ×eriesWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = timeseriesWidget.Definition
|
|
case TOPLIST_WIDGET:
|
|
var toplistWidget struct {
|
|
Definition ToplistDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &toplistWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = toplistWidget.Definition
|
|
case TRACE_SERVICE_WIDGET:
|
|
var traceServiceWidget struct {
|
|
Definition TraceServiceDefinition `json:"definition"`
|
|
}
|
|
if err := json.Unmarshal(data, &traceServiceWidget); err != nil {
|
|
return err
|
|
}
|
|
widget.Definition = traceServiceWidget.Definition
|
|
default:
|
|
return fmt.Errorf("Cannot unmarshal widget of type: %s", *widgetHandler.Definition.Type)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
//
|
|
// List of structs common to multiple widget definitions
|
|
//
|
|
|
|
type WidgetTime struct {
|
|
LiveSpan *string `json:"live_span,omitempty"`
|
|
}
|
|
|
|
type WidgetAxis struct {
|
|
Label *string `json:"label,omitempty"`
|
|
Scale *string `json:"scale,omitempty"`
|
|
Min *string `json:"min,omitempty"`
|
|
Max *string `json:"max,omitempty"`
|
|
IncludeZero *bool `json:"include_zero,omitempty"`
|
|
}
|
|
|
|
type WidgetEvent struct {
|
|
Query *string `json:"q"`
|
|
}
|
|
|
|
type WidgetMarker struct {
|
|
Value *string `json:"value"`
|
|
DisplayType *string `json:"display_type,omitempty"`
|
|
Label *string `json:"label,omitempty"`
|
|
}
|
|
|
|
type WidgetMetadata struct {
|
|
Expression *string `json:"expression"`
|
|
AliasName *string `json:"alias_name,omitempty"`
|
|
}
|
|
|
|
type WidgetConditionalFormat struct {
|
|
Comparator *string `json:"comparator"`
|
|
Value *float64 `json:"value"`
|
|
Palette *string `json:"palette"`
|
|
CustomBgColor *string `json:"custom_bg_color,omitempty"`
|
|
CustomFgColor *string `json:"custom_fg_color,omitempty"`
|
|
ImageUrl *string `json:"image_url,omitempty"`
|
|
HideValue *bool `json:"hide_value,omitempty"`
|
|
Timeframe *string `json:"timeframe,omitempty"`
|
|
Metric *string `json:"metric,omitempty"`
|
|
}
|
|
|
|
// WidgetApmOrLogQuery represents an APM or a Log query
|
|
type WidgetApmOrLogQuery struct {
|
|
Index *string `json:"index"`
|
|
Compute *ApmOrLogQueryCompute `json:"compute,omitempty"`
|
|
MultiCompute []ApmOrLogQueryCompute `json:"multi_compute,omitempty"`
|
|
Search *ApmOrLogQuerySearch `json:"search,omitempty"`
|
|
GroupBy []ApmOrLogQueryGroupBy `json:"group_by,omitempty"`
|
|
}
|
|
type ApmOrLogQueryCompute struct {
|
|
Aggregation *string `json:"aggregation"`
|
|
Facet *string `json:"facet,omitempty"`
|
|
Interval *int `json:"interval,omitempty"`
|
|
}
|
|
type ApmOrLogQuerySearch struct {
|
|
Query *string `json:"query"`
|
|
}
|
|
type ApmOrLogQueryGroupBy struct {
|
|
Facet *string `json:"facet"`
|
|
Limit *int `json:"limit,omitempty"`
|
|
Sort *ApmOrLogQueryGroupBySort `json:"sort,omitempty"`
|
|
}
|
|
type ApmOrLogQueryGroupBySort struct {
|
|
Aggregation *string `json:"aggregation"`
|
|
Order *string `json:"order"`
|
|
Facet *string `json:"facet,omitempty"`
|
|
}
|
|
|
|
// WidgetProcessQuery represents a Process query
|
|
type WidgetProcessQuery struct {
|
|
Metric *string `json:"metric"`
|
|
SearchBy *string `json:"search_by,omitempty"`
|
|
FilterBy []string `json:"filter_by,omitempty"`
|
|
Limit *int `json:"limit,omitempty"`
|
|
}
|
|
|
|
// WidgetRequestStyle represents the style that can be apply to a request
|
|
type WidgetRequestStyle struct {
|
|
Palette *string `json:"palette,omitempty"`
|
|
}
|