cmd/degradation-analyzer/main.go (100 lines of code) (raw):

package main import ( "log/slog" "net/http" "os" "slices" "sync" "time" "github.com/JetBrains/ij-perf-report-aggregator/pkg/util" detector "github.com/JetBrains/ij-perf-report-aggregator/pkg/degradation-detector" "github.com/JetBrains/ij-perf-report-aggregator/pkg/degradation-detector/setting" ) func main() { backendUrl := getBackendUrl() client := createHttpClient() slog.Info("started") analysisSettings := make([]detector.Settings, 0, 25000) for _, s := range generatePerformanceSettings(backendUrl, client) { analysisSettings = append(analysisSettings, s) } for _, s := range generateStartupSettings(backendUrl, client) { analysisSettings = append(analysisSettings, s) } for _, s := range generateFleetStartupSettings() { analysisSettings = append(analysisSettings, s) } metrics := detector.FetchMetricsFromClickhouse(analysisSettings, client, backendUrl) metricsForDegradation := make(chan detector.QueryResultWithSettings, 5) metricsForMissingMetrics := make(chan detector.QueryResultWithSettings, 5) util.Broadcast(metrics, metricsForDegradation, metricsForMissingMetrics) var wg sync.WaitGroup wg.Go(func() { degradations := detector.InferDegradations(metricsForDegradation) insertionResults := detector.PostDegradations(client, backendUrl, degradations) filteredResults := detector.FilterErrors(insertionResults) mergedResults := detector.MergeDegradations(filteredResults) detector.SendDegradationsToSlack(mergedResults, client) }) wg.Go(func() { missingData := detector.InferMissingData(metricsForMissingMetrics) missingData = detector.PostMissingData(client, backendUrl, missingData) mergedMissingData := detector.MergeMissingData(missingData) detector.SendMissingDataMessages(mergedMissingData, client) }) wg.Wait() slog.Info("finished") } func getBackendUrl() string { backendUrl := os.Getenv("BACKEND_URL") if backendUrl == "" { backendUrl = "https://ij-perf-api.labs.jb.gg" // Default URL slog.Info("BACKEND_URL is not set, using default value: %s", "url", backendUrl) } return backendUrl } func createHttpClient() *http.Client { return &http.Client{ Timeout: 60 * time.Second, Transport: &http.Transport{ MaxIdleConns: 20, MaxIdleConnsPerHost: 10, }, } } func generateStartupSettings(backendUrl string, client *http.Client) []detector.StartupSettings { return slices.Concat( setting.GenerateStartupSettingsForIDEA(backendUrl, client), setting.GenerateStartupSettingsForGoland(backendUrl, client), ) } func generateFleetStartupSettings() []detector.FleetStartupSettings { return slices.Concat( setting.GenerateFleetStartupSettings(), ) } func generatePerformanceSettings(backendUrl string, client *http.Client) []detector.PerformanceSettings { return slices.Concat( setting.GenerateIdeaIndexingSettings(backendUrl, client), setting.GenerateWorkspaceSettings(), setting.GenerateKotlinSettings(), setting.GenerateKotlinIdeaSettings(backendUrl, client), setting.GenerateMavenSettings(), setting.GenerateGradleSettings(), setting.GenerateVCSSettings(), setting.GeneratePhpStormSettings(backendUrl, client), setting.GenerateClionSettings(backendUrl, client), setting.GenerateAllUnitTestsSettings(backendUrl, client), setting.GenerateGolandPerfSettings(backendUrl, client), setting.GenerateRustPerfSettings(backendUrl, client), setting.GenerateFleetPerformanceSettings(backendUrl, client), setting.GenerateRubyPerfSettings(backendUrl, client), setting.GenerateJavaSettings(backendUrl, client), setting.GenerateUltimateSettings(backendUrl, client), setting.GenerateAIASettings(), setting.GenerateAIATestTokenSettings(), setting.GenerateKotlinBuildToolsSettings(backendUrl, client), setting.GenerateKotlinMultiplatformToolingSettings(backendUrl, client), setting.GenerateUISettings(), ) }