mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-07-29 01:12:04 +08:00

* chore(savedview): refactor into module and handler * chore(rule): move telemetry inside telemetry * chore(apdex): refactor apdex and delete dao * chore(dashboard): create a dashboard module * chore(ee): get rid of the init nonesense * chore(dashboard): fix err and apierror confusion * chore: address comments
141 lines
5.0 KiB
Go
141 lines
5.0 KiB
Go
package telemetry
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"slices"
|
|
"strings"
|
|
|
|
"github.com/SigNoz/signoz/pkg/query-service/model"
|
|
v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3"
|
|
"github.com/SigNoz/signoz/pkg/sqlstore"
|
|
"github.com/SigNoz/signoz/pkg/types/alertmanagertypes"
|
|
"github.com/SigNoz/signoz/pkg/types/ruletypes"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func getChannels(ctx context.Context, sqlstore sqlstore.SQLStore) ([]*alertmanagertypes.Channel, error) {
|
|
channels := []*alertmanagertypes.Channel{}
|
|
if err := sqlstore.BunDB().NewSelect().Model(&channels).Scan(ctx); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return channels, nil
|
|
}
|
|
|
|
func GetAlertsInfo(ctx context.Context, sqlstore sqlstore.SQLStore) (*model.AlertsInfo, error) {
|
|
alertsInfo := model.AlertsInfo{}
|
|
|
|
var alertsData []string
|
|
var alertNames []string
|
|
err := sqlstore.BunDB().NewSelect().Model((*ruletypes.Rule)(nil)).Column("data").Scan(ctx, &alertsData)
|
|
if err != nil {
|
|
zap.L().Error("Error in processing sql query", zap.Error(err))
|
|
return &alertsInfo, err
|
|
}
|
|
for _, alert := range alertsData {
|
|
var rule ruletypes.GettableRule
|
|
if strings.Contains(alert, "time_series_v2") {
|
|
alertsInfo.AlertsWithTSV2 = alertsInfo.AlertsWithTSV2 + 1
|
|
}
|
|
err = json.Unmarshal([]byte(alert), &rule)
|
|
if err != nil {
|
|
zap.L().Error("invalid rule data", zap.Error(err))
|
|
continue
|
|
}
|
|
alertNames = append(alertNames, rule.AlertName)
|
|
if rule.AlertType == ruletypes.AlertTypeLogs {
|
|
alertsInfo.LogsBasedAlerts = alertsInfo.LogsBasedAlerts + 1
|
|
|
|
if rule.RuleCondition != nil && rule.RuleCondition.CompositeQuery != nil {
|
|
if rule.RuleCondition.CompositeQuery.QueryType == v3.QueryTypeClickHouseSQL {
|
|
if strings.Contains(alert, "signoz_logs.distributed_logs") ||
|
|
strings.Contains(alert, "signoz_logs.logs") {
|
|
alertsInfo.AlertsWithLogsChQuery = alertsInfo.AlertsWithLogsChQuery + 1
|
|
}
|
|
}
|
|
}
|
|
|
|
for _, query := range rule.RuleCondition.CompositeQuery.BuilderQueries {
|
|
if rule.RuleCondition.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
|
if query.Filters != nil {
|
|
for _, item := range query.Filters.Items {
|
|
if slices.Contains([]string{"contains", "ncontains", "like", "nlike"}, string(item.Operator)) {
|
|
if item.Key.Key != "body" {
|
|
alertsInfo.AlertsWithLogsContainsOp += 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if rule.AlertType == ruletypes.AlertTypeMetric {
|
|
alertsInfo.MetricBasedAlerts = alertsInfo.MetricBasedAlerts + 1
|
|
if rule.RuleCondition != nil && rule.RuleCondition.CompositeQuery != nil {
|
|
if rule.RuleCondition.CompositeQuery.QueryType == v3.QueryTypeBuilder {
|
|
alertsInfo.MetricsBuilderQueries = alertsInfo.MetricsBuilderQueries + 1
|
|
} else if rule.RuleCondition.CompositeQuery.QueryType == v3.QueryTypeClickHouseSQL {
|
|
alertsInfo.MetricsClickHouseQueries = alertsInfo.MetricsClickHouseQueries + 1
|
|
} else if rule.RuleCondition.CompositeQuery.QueryType == v3.QueryTypePromQL {
|
|
alertsInfo.MetricsPrometheusQueries = alertsInfo.MetricsPrometheusQueries + 1
|
|
for _, query := range rule.RuleCondition.CompositeQuery.PromQueries {
|
|
if strings.Contains(query.Query, "signoz_") {
|
|
alertsInfo.SpanMetricsPrometheusQueries = alertsInfo.SpanMetricsPrometheusQueries + 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if rule.RuleType == ruletypes.RuleTypeAnomaly {
|
|
alertsInfo.AnomalyBasedAlerts = alertsInfo.AnomalyBasedAlerts + 1
|
|
}
|
|
} else if rule.AlertType == ruletypes.AlertTypeTraces {
|
|
alertsInfo.TracesBasedAlerts = alertsInfo.TracesBasedAlerts + 1
|
|
|
|
if rule.RuleCondition != nil && rule.RuleCondition.CompositeQuery != nil {
|
|
if rule.RuleCondition.CompositeQuery.QueryType == v3.QueryTypeClickHouseSQL {
|
|
if strings.Contains(alert, "signoz_traces.distributed_signoz_index_v2") ||
|
|
strings.Contains(alert, "signoz_traces.distributed_signoz_spans") ||
|
|
strings.Contains(alert, "signoz_traces.distributed_signoz_error_index_v2") {
|
|
alertsInfo.AlertsWithTraceChQuery = alertsInfo.AlertsWithTraceChQuery + 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
alertsInfo.TotalAlerts = alertsInfo.TotalAlerts + 1
|
|
if !rule.PostableRule.Disabled {
|
|
alertsInfo.TotalActiveAlerts = alertsInfo.TotalActiveAlerts + 1
|
|
}
|
|
}
|
|
alertsInfo.AlertNames = alertNames
|
|
|
|
channels, err := getChannels(ctx, sqlstore)
|
|
if err != nil {
|
|
return &alertsInfo, err
|
|
}
|
|
if channels != nil {
|
|
alertsInfo.TotalChannels = len(channels)
|
|
for _, channel := range channels {
|
|
if channel.Type == "slack" {
|
|
alertsInfo.SlackChannels = alertsInfo.SlackChannels + 1
|
|
}
|
|
if channel.Type == "webhook" {
|
|
alertsInfo.WebHookChannels = alertsInfo.WebHookChannels + 1
|
|
}
|
|
if channel.Type == "email" {
|
|
alertsInfo.EmailChannels = alertsInfo.EmailChannels + 1
|
|
}
|
|
if channel.Type == "pagerduty" {
|
|
alertsInfo.PagerDutyChannels = alertsInfo.PagerDutyChannels + 1
|
|
}
|
|
if channel.Type == "opsgenie" {
|
|
alertsInfo.OpsGenieChannels = alertsInfo.OpsGenieChannels + 1
|
|
}
|
|
if channel.Type == "msteams" {
|
|
alertsInfo.MSTeamsChannels = alertsInfo.MSTeamsChannels + 1
|
|
}
|
|
}
|
|
}
|
|
|
|
return &alertsInfo, nil
|
|
}
|