diff --git a/cmd/app/handler/slack_handler.go b/cmd/app/handler/slack_handler.go index 869edaf..21dc39f 100644 --- a/cmd/app/handler/slack_handler.go +++ b/cmd/app/handler/slack_handler.go @@ -5,7 +5,6 @@ import ( "houston/appcontext" "houston/common/util" "houston/internal/cron" - "houston/internal/diagnostic" "houston/internal/processor" "houston/internal/resolver" "houston/model/incident" @@ -40,7 +39,6 @@ type slackHandler struct { memberJoinCallbackProcessor *processor.MemberJoinedCallbackEventProcessor blockActionProcessor *processor.BlockActionProcessor viewSubmissionProcessor *processor.ViewSubmissionProcessor - diagnosticCommandProcessor *processor.DiagnosticCommandProcessor userChangeEventProcessor *processor.UserChangeEventProcessor houstonCommandResolver *resolver.HoustonCommandResolver } @@ -54,8 +52,6 @@ func NewSlackHandler(gormClient *gorm.DB, socketModeClient *socketmode.Client) * userService := user.NewUserRepository(gormClient) shedlockService := shedlock.NewShedlockRepository(gormClient) slackbotClient := slackbot.NewSlackClient(socketModeClient) - grafanaRepository := diagnostic.NewDiagnoseRepository(gormClient) - diagnosticCommandProcessor := processor.NewDiagnosticCommandProcessor(socketModeClient, grafanaRepository) incidentServiceV2 := incidentServiceV2.NewIncidentServiceV2(gormClient) slackService := slack2.NewSlackService() // new services @@ -84,9 +80,8 @@ func NewSlackHandler(gormClient *gorm.DB, socketModeClient *socketmode.Client) * } return &slackHandler{ - socketModeClient: socketModeClient, - slashCommandProcessor: slashCommandProcessor, - diagnosticCommandProcessor: diagnosticCommandProcessor, + socketModeClient: socketModeClient, + slashCommandProcessor: slashCommandProcessor, memberJoinCallbackProcessor: processor.NewMemberJoinedCallbackEventProcessor( socketModeClient, incidentService, teamService, severityService, ), @@ -99,7 +94,7 @@ func NewSlackHandler(gormClient *gorm.DB, socketModeClient *socketmode.Client) * userChangeEventProcessor: processor.NewUserChangeEventProcessor( socketModeClient, userService, ), - houstonCommandResolver: resolver.NewHoustonCommandResolver(diagnosticCommandProcessor, socketModeClient, slackbotClient, rcaService), + houstonCommandResolver: resolver.NewHoustonCommandResolver(socketModeClient, slackbotClient, rcaService), } } diff --git a/db/migration/000013_drop_unused_tables.up.sql b/db/migration/000013_drop_unused_tables.up.sql new file mode 100644 index 0000000..b97ea8c --- /dev/null +++ b/db/migration/000013_drop_unused_tables.up.sql @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS role; +DROP TABLE IF EXISTS team_tag; +DROP TABLE IF EXISTS dbz_heartbeat; +DROP TABLE IF EXISTS deployment_config_mapping; +DROP TABLE IF EXISTS deployment_mapping; +DROP TABLE IF EXISTS diagnose_runbook; +DROP TABLE IF EXISTS grafana_mapping; +DROP TABLE IF EXISTS kibana_mapping; \ No newline at end of file diff --git a/internal/diagnostic/DiagnoseRepository.go b/internal/diagnostic/DiagnoseRepository.go deleted file mode 100644 index ca3c1bd..0000000 --- a/internal/diagnostic/DiagnoseRepository.go +++ /dev/null @@ -1,57 +0,0 @@ -package diagnostic - -import ( - "gorm.io/gorm" - "houston/internal/diagnostic/models/entity" - "houston/model/severity" -) - -type Repository struct { - gormClient *gorm.DB - severityService *severity.Repository -} - -func NewDiagnoseRepository(gormClient *gorm.DB) *Repository { - return &Repository{ - gormClient: gormClient, - } -} - -func (r *Repository) GetGrafanaLinksForAlert(alertId string) ([]entity.GrafanaDiagnosticEntity, error) { - var grafanaLink []entity.GrafanaDiagnosticEntity - - result := r.gormClient.Table("grafana_mapping").Find(&grafanaLink, "alert_id = ?", alertId) - if result.Error != nil { - return nil, result.Error - } - if result.RowsAffected == 0 { - return nil, nil - } - return grafanaLink, nil -} - -func (r *Repository) GetDeploymentPortalDetails(alertId string) ([]entity.DeploymentDiagnosticEntity, error) { - var portalDetails []entity.DeploymentDiagnosticEntity - - result := r.gormClient.Table("deployment_mapping").Find(&portalDetails, "alert_id = ?", alertId) - if result.Error != nil { - return nil, result.Error - } - if result.RowsAffected == 0 { - return nil, nil - } - return portalDetails, nil -} - -func (r *Repository) GetDeploymentConfigDetails(alertId string) ([]entity.DeploymentConfigEntity, error) { - var portalDetails []entity.DeploymentConfigEntity - - result := r.gormClient.Table("deployment_config_mapping").Find(&portalDetails, "alert_id = ?", alertId) - if result.Error != nil { - return nil, result.Error - } - if result.RowsAffected == 0 { - return nil, nil - } - return portalDetails, nil -} diff --git a/internal/diagnostic/assembler.go b/internal/diagnostic/assembler.go deleted file mode 100644 index 60e5291..0000000 --- a/internal/diagnostic/assembler.go +++ /dev/null @@ -1,91 +0,0 @@ -package diagnostic - -import ( - "bytes" - "github.com/google/uuid" - "github.com/slack-go/slack" - "houston/internal/diagnostic/models" -) - -type DataAssembler interface { - HandleData(runbooks []models.Runbook) string -} - -type AssemblerData struct { -} - -type DataAssemblerImpl struct { - assemblerData AssemblerData -} - -type DataAssembler2Impl struct { - assemblerData AssemblerData -} - -func NewDiagnosticDataAssembler() *DataAssemblerImpl { - return &DataAssemblerImpl{ - assemblerData: AssemblerData{}, - } -} - -func NewDiagnosticDataAssembler2() *DataAssembler2Impl { - return &DataAssembler2Impl{ - assemblerData: AssemblerData{}, - } -} - -func (gah *DataAssemblerImpl) HandleData(runbooks []models.Runbook) (slack.MsgOption, []slack.Attachment) { - var messageBlock slack.MsgOption - attachments := make([]slack.Attachment, 0) - for _, runbook := range runbooks { - if runbook.ImagePaths != nil { - imageMessages := make([]slack.Block, 0) - for it, images := range runbook.ImagePaths { - imageBlock := slack.NewImageBlock(images, "", "id"+string(rune(it)), &slack.TextBlockObject{Type: "plain_text", Text: "abc"}) - imageMessages = append(imageMessages, imageBlock) - } - messageBlock = slack.MsgOptionBlocks(imageMessages...) - } - if runbook.TextSnippets != nil { - attachment := slack.Attachment{ - Text: runbook.TextSnippets[0], - } - attachments = append(attachments, attachment) - } - } - return messageBlock, attachments -} - -func (gah *DataAssembler2Impl) HandleData(runbooks []models.Runbook) (slack.MsgOption, []slack.Attachment) { - var messageBlock slack.MsgOption - messages := make([]slack.Block, 0) - attachments := make([]slack.Attachment, 0) - for _, runbook := range runbooks { - if runbook.ImagePaths != nil { - for _, images := range runbook.ImagePaths { - id, _ := uuid.NewUUID() - textBlock := &slack.TextBlockObject{ - Type: "plain_text", - Text: "image", - } - imageSectionBlock := slack.NewImageBlock(images, "", id.String(), textBlock) - messages = append(messages, imageSectionBlock) - } - } - if runbook.TextSnippets != nil { - var message bytes.Buffer - for it, text := range runbook.TextSnippets { - if it == 0 { - message.WriteString(text) - continue - } - message.WriteString("\n>" + text) - } - textBlock := slack.NewTextBlockObject("mrkdwn", message.String(), false, false) - block := slack.NewSectionBlock(textBlock, nil, nil) - messages = append(messages, block) - } - } - messageBlock = slack.MsgOptionBlocks(messages...) - return messageBlock, attachments -} diff --git a/internal/diagnostic/deploymentConfigHandler.go b/internal/diagnostic/deploymentConfigHandler.go deleted file mode 100644 index 75e168a..0000000 --- a/internal/diagnostic/deploymentConfigHandler.go +++ /dev/null @@ -1,160 +0,0 @@ -package diagnostic - -import ( - "encoding/json" - "fmt" - "github.com/joho/godotenv" - "github.com/spf13/viper" - "go.uber.org/zap" - "houston/config" - "houston/internal/clients" - "houston/logger" - "io" - "net/http" - "strconv" -) - -func DeploymentConfigHandler(repo *Repository, alertId string) []string { - deploymentConfigDetails, _ := repo.GetDeploymentConfigDetails(alertId) - config.LoadHoustonConfig() - godotenv.Load() - logger.Info("DeploymentConfigHandler") - client := clients.NewHttpClient() - result := make([]string, 0) - configClient := NewConfigClient(client.HttpClient) - result = append(result, ":ghost: *New and Updated configs* :ghost:") - for _, deploymentConfig := range deploymentConfigDetails { - baseUrl := deploymentConfig.DeploymentPortalUrl - bearerToken := getBearerTokenForConfigBaseUrl(baseUrl) - config := DeploymentConfig{ - BaseUrl: baseUrl, - BearerToken: bearerToken, - } - configListResponse, _ := configClient.getConfigResponse(config, deploymentConfig.ManifestId) - if configListResponse != nil && len(configListResponse) > 2 { - deploymentConfig1, _ := configClient.getConfigResponseForVersion(config, deploymentConfig.ManifestId, strconv.Itoa(configListResponse[0])) - deploymentConfig2, _ := configClient.getConfigResponseForVersion(config, deploymentConfig.ManifestId, strconv.Itoa(configListResponse[1])) - diff := calculateDiff(deploymentConfig1, deploymentConfig2) - result = append(result, diff...) - } - } - return result -} - -func (m *ConfigClient) getConfigResponseForVersion(config DeploymentConfig, manifestId string, version string) (*ConfigResponse, error) { - client := m.HttpClient - req, _ := http.NewRequest("GET", fmt.Sprintf("%sapi/manifest/%s/version/%s", config.BaseUrl, manifestId, version), nil) - req.Header.Add("X_AUTH_TOKEN", fmt.Sprintf("%s", config.BearerToken)) - resp, err := client.Do(req) - if err != nil { - m.Logger.Error(err.Error()) - return nil, err - } - - defer resp.Body.Close() - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - m.Logger.Error(err.Error()) - return nil, err - } - var response ConfigResponse - err = json.Unmarshal(responseBody, &response) - if err != nil { - m.Logger.Error(err.Error()) - return nil, err - } - - return &response, nil -} - -func (m *ConfigClient) getConfigResponse(config DeploymentConfig, manifestId string) (ConfigList, error) { - client := m.HttpClient - req, _ := http.NewRequest("GET", fmt.Sprintf("%sapi/manifest/%s/version/list", config.BaseUrl, manifestId), nil) - req.Header.Add("X_AUTH_TOKEN", fmt.Sprintf("%s", config.BearerToken)) - resp, err := client.Do(req) - if err != nil { - m.Logger.Error(err.Error()) - return nil, err - } - - defer resp.Body.Close() - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - m.Logger.Error(err.Error()) - return nil, err - } - var response ConfigList - err = json.Unmarshal(responseBody, &response) - if err != nil { - m.Logger.Error(err.Error()) - return nil, err - } - - return response, nil -} - -func calculateDiff(response1 *ConfigResponse, response2 *ConfigResponse) []string { - if response1 == nil || response2 == nil { - logger.Info("either response1 is null or response1 is") - } - diff := make([]string, 0) - var result = make(map[string]string) - for _, v := range response1.EnvironmentVariables { - result[v.Name] = v.Value - } - for _, variable := range response2.EnvironmentVariables { - value, ok := result[variable.Name] - if ok { - if value != variable.Value { - diff = append(diff, variable.Name+", New: "+value+" old: "+variable.Value) - } - } else { - diff = append(diff, variable.Name+", New: "+value+" old: "+variable.Value) - } - delete(result, variable.Name) - } - for key, variable := range result { - diff = append(diff, key+", New: "+variable) - } - return diff -} - -func getBearerTokenForConfigBaseUrl(baseUrl string) string { - switch url := baseUrl; url { - case "https://sa-deployment-portal-backend.cmd.navi-tech.in/": - return viper.GetString("config.sa.keys") - default: - return "" - } -} - -func NewConfigClient(httpClient *http.Client) *ConfigClient { - return &ConfigClient{ - HttpClient: httpClient, - } -} - -type ConfigList []int - -type ConfigClient struct { - HttpClient *http.Client - Logger *zap.Logger - baseUrl string - config GoCDConnectionConfig -} - -type ConfigResponse struct { - Name string `json:"name"` - EnvironmentVariables []EnvironmentVariable `json:"environmentVariables"` -} - -type EnvironmentVariable struct { - Name string `json:"name,omitempty"` - Value string `json:"value,omitempty"` - Type string `json:"type,omitempty"` -} - -type DeploymentConfig struct { - BaseUrl string - BearerToken string -} diff --git a/internal/diagnostic/deploymentPortalHandler.go b/internal/diagnostic/deploymentPortalHandler.go deleted file mode 100644 index cfdfc2d..0000000 --- a/internal/diagnostic/deploymentPortalHandler.go +++ /dev/null @@ -1,123 +0,0 @@ -package diagnostic - -import ( - "bytes" - "encoding/json" - "fmt" - "github.com/joho/godotenv" - "github.com/spf13/viper" - "houston/config" - "houston/internal/clients" - "houston/logger" - "io" - "net/http" - "time" -) - -func DeploymentPortalHandler(repo *Repository, alertId string) []string { - deplymentPortalDetails, _ := repo.GetDeploymentPortalDetails(alertId) - config.LoadHoustonConfig() - godotenv.Load() - - client := clients.NewHttpClient() - result := make([]string, 0) - goCDClient := NewGoCDClient(client.HttpClient) - for _, deploymentPortal := range deplymentPortalDetails { - baseUrl := deploymentPortal.DeploymentPortalUrl - bearerToken := getBearerTokenForBaseUrl(baseUrl) - config := GoCDConnectionConfig{ - BaseUrl: baseUrl, - BearerToken: bearerToken, - } - response, _ := goCDClient.getPipelineHistoryResponse(config, deploymentPortal.ServiceName) - if len(response.Pipelines) > 0 { - result = append(result, " :ghost: *"+response.Pipelines[0].Name+"* :ghost:") - for _, pipeLine := range response.Pipelines { - var singleDeployment bytes.Buffer - singleDeployment.WriteString("Approver ") - singleDeployment.WriteString(pipeLine.BuildCause.Approver) - singleDeployment.WriteString(" Message: ") - singleDeployment.WriteString(pipeLine.BuildCause.TriggerMessage) - singleDeployment.WriteString(" on ") - singleDeployment.WriteString(getDate(pipeLine.ScheduledDate)) - result = append(result, singleDeployment.String()) - } - } - } - return result -} - -func getDate(date int64) string { - loc, _ := time.LoadLocation("Asia/Kolkata") - tm := time.Unix(0, date*int64(time.Millisecond)).In(loc) - tm.Format("2006-02-01 15:01:05") - return tm.String() -} - -func getBearerTokenForBaseUrl(baseUrl string) string { - switch url := baseUrl; url { - case "https://sa-pipelines.cmd.navi-tech.in": - return viper.GetString("gocd.sa.bearer.token") - default: - return "" - } -} - -type GoCDClient struct { - HttpClient *http.Client - baseUrl string - config GoCDConnectionConfig -} - -type GoCDConnectionConfig struct { - BaseUrl string - BearerToken string -} - -func NewGoCDClient(httpClient *http.Client) *GoCDClient { - return &GoCDClient{ - HttpClient: httpClient, - } -} - -type GoCdResponse struct { - Pipelines []GoCdStageRun `json:"pipelines,omitempty"` -} - -type GoCdStageRun struct { - Name string `json:"name,omitempty"` - StageCounter int32 `json:"counter,omitempty"` - ScheduledDate int64 `json:"scheduled_date,omitempty"` - BuildCause GoCdBuildCause `json:"build_cause,omitempty"` -} - -type GoCdBuildCause struct { - TriggerMessage string `json:"trigger_message,omitempty"` - Approver string `json:"approver,omitempty"` -} - -func (m *GoCDClient) getPipelineHistoryResponse(config GoCDConnectionConfig, pipelineName string) (*GoCdResponse, error) { - client := m.HttpClient - req, _ := http.NewRequest("GET", fmt.Sprintf("%s/go/api/pipelines/%s/history", config.BaseUrl, pipelineName), nil) - req.Header.Add("Authorization", fmt.Sprintf("bearer %s", config.BearerToken)) - req.Header.Add("Accept", "application/vnd.go.cd.v1+json") - resp, err := client.Do(req) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - var response GoCdResponse - err = json.Unmarshal(responseBody, &response) - if err != nil { - logger.Error(err.Error()) - return nil, err - } - - return &response, nil -} diff --git a/internal/diagnostic/kibanaActionHandler.go b/internal/diagnostic/kibanaActionHandler.go deleted file mode 100644 index dc21e7e..0000000 --- a/internal/diagnostic/kibanaActionHandler.go +++ /dev/null @@ -1,156 +0,0 @@ -package diagnostic - -import ( - "bytes" - "fmt" - "github.com/goccy/go-json" - "io" - "log" - "net/http" - "strings" - "time" -) - -func GetKibana() string { - client := &http.Client{} - var data = strings.NewReader(`{"name":"TEMP_MONITOR","type":"monitor","enabled":true,"schedule":{"period":{"unit":"HOURS","interval":2}},"inputs":[{"search":{"query":{"query":{"bool":{"must":[{"range":{"time":{"from":"now-2h","to":"now","include_lower":true,"include_upper":true,"boost":1}}}],"filter":[{"bool":{"should":[{"multi_match":{"query":"Exception","fields":[],"type":"best_fields","operator":"OR","slop":0,"prefix_length":0,"max_expansions":50,"lenient":true,"zero_terms_query":"NONE","auto_generate_synonyms_phrase_query":true,"fuzzy_transpositions":true,"boost":1}},{"regexp":{"log_processed.error.type":{"value":".*Exception","flags_value":255,"case_insensitive":true,"max_determinized_states":10000,"rewrite":"constant_score","boost":1}}},{"regexp":{"log_processed.error.stack_trace":{"value":".*Exception","flags_value":255,"case_insensitive":true,"max_determinized_states":10000,"rewrite":"constant_score","boost":1}}}],"adjust_pure_negative":true,"boost":1}}],"must_not":[{"match_phrase":{"log_processed.error.type":{"query":"com.navi.sa.survey.exception.throwable.SurveyDoesNotExistsException","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"log_processed.log.logger":{"query":"org.apache.http.client.protocol.ResponseProcessCookies","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"log_processed.log.level":{"query":"INFO","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"namespace_name":{"query":"navi-ops-tech-prod","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"container_name":{"query":"mjolnir-service-navi-service","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"container_name":{"query":"crm-web-external-bff-navi-service","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"container_name":{"query":"annotation-service-navi-service","slop":0,"zero_terms_query":"NONE","boost":1}}},{"match_phrase":{"container_name":{"query":"label-studio-navi-service","slop":0,"zero_terms_query":"NONE","boost":1}}}],"adjust_pure_negative":true,"boost":1}},"aggregations":{"2":{"terms":{"field":"container_name.keyword","missing":"__missing__","size":10,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}]},"aggregations":{"3":{"terms":{"field":"log_processed.error.type.keyword","missing":"__missing__","size":10,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}]}}}}}},"indices":["production-*"]}}],"triggers":[],"ui_metadata":{"schedule":{"timezone":null,"frequency":"interval","period":{"unit":"HOURS","interval":2},"daily":0,"weekly":{"tue":false,"wed":false,"thur":false,"sat":false,"fri":false,"mon":false,"sun":false},"monthly":{"type":"day","day":1},"cronExpression":"0 */1 * * *"},"search":{"searchType":"query","aggregationType":"count","timeField":"","fieldName":"","overDocuments":"all documents","groupedOverTop":5,"groupedOverFieldName":"bytes","bucketValue":1,"bucketUnitOfTime":"h","where":{"fieldName":[],"fieldRangeEnd":0,"fieldRangeStart":0,"fieldValue":"","operator":"is"}}}}`) - req, err := http.NewRequest("POST", "https://vpc-sa-prod-isieo6nwenbw3jsdbhxgdx4l4m.ap-south-1.es.amazonaws.com/_plugin/kibana/api/alerting/monitors/_execute", data) - if err != nil { - log.Fatal(err) - } - req.Header.Set("authority", "vpc-sa-prod-isieo6nwenbw3jsdbhxgdx4l4m.ap-south-1.es.amazonaws.com") - req.Header.Set("accept", "*/*") - req.Header.Set("accept-language", "en-GB,en-US;q=0.9,en;q=0.8") - req.Header.Set("content-type", "application/json") - req.Header.Set("cookie", "STATE-TOKEN=f3862786-ea9d-426a-9479-164f9e0b28cd; ID-TOKEN=eyJraWQiOiJhMFVucVpSQndieEZOczBmMGhQKzhrczRIZUF2bnNJSGhienEwZWJzNTdvPSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoiLW9scF9KbVRsWERaZW5Wcm1NblFXZyIsInN1YiI6ImY0YjYzZDY5LTQ0ZWYtNGU2Mi04NjA3LWVkN2QyYjVlNmNhOCIsImNvZ25pdG86Z3JvdXBzIjpbImFwLXNvdXRoLTFfVnhCcXptSk1FX09rdGEiXSwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuYXAtc291dGgtMS5hbWF6b25hd3MuY29tXC9hcC1zb3V0aC0xX1Z4QnF6bUpNRSIsImNvZ25pdG86dXNlcm5hbWUiOiJPa3RhX3R1c2hhci5zYWhhQG5hdmkuY29tIiwibm9uY2UiOiJ5cUdPWWhlOUlDS3N4VE1jQnk1VUN1ZTA2THJEUU1IaEtyVFJyRzJ3QTRMaEttVnRxNFVCcERhNUtxSGphNmpYZGVqN0I0dWFkamYzZEJIWmV4OXpDNG5UQmJ2eHJ0X1ROWTdEM0RSV1Y5ZDJ1Mm42ZmkyNzEzWGtTbTZSWGRGalJyWjVEXzZQOG1YZExtellsVUw4ZlhoQ3VjNElYV25mTTNrRmlFSDNWRTgiLCJvcmlnaW5fanRpIjoiMmQ0NTg3OGUtZTBlNi00OGNmLWJjNzMtNzJmNWI5NzdhYjc3IiwiYXVkIjoiMTJzbTk3M2ZwNGg2bW9nZWczbTA2ZnUxZmgiLCJpZGVudGl0aWVzIjpbeyJ1c2VySWQiOiJ0dXNoYXIuc2FoYUBuYXZpLmNvbSIsInByb3ZpZGVyTmFtZSI6Ik9rdGEiLCJwcm92aWRlclR5cGUiOiJTQU1MIiwiaXNzdWVyIjoiaHR0cDpcL1wvd3d3Lm9rdGEuY29tXC9leGtjamJvNWY2NWlJV2pkODM1NyIsInByaW1hcnkiOiJ0cnVlIiwiZGF0ZUNyZWF0ZWQiOiIxNjg0NTYwOTA3MzAxIn1dLCJ0b2tlbl91c2UiOiJpZCIsImF1dGhfdGltZSI6MTY4NDU2MDkwNywiZXhwIjoxNjg0NTY0NTA3LCJpYXQiOjE2ODQ1NjA5MDcsImp0aSI6ImY1ZTM5OWI1LTNhMjEtNGQ1Zi04MGUyLTE4Yjc1NTBkY2I2YSIsImVtYWlsIjoidHVzaGFyLnNhaGFAbmF2aS5jb20ifQ.oFg5IjZBqjKyzSeOrtRSq3e9_j9EMcdRpFFnxj90jpybl-Ha2I5oa7CjT87dG9MRTvJ3_1YPkfYCRlaTYX4u2QhVtinqPSSMS7AaUZJWZdrv9hYU6EGmd3Wo-OibebXorBi_Jc0RwPNB7E9Ld_XovkIKVUFjmrq48VrmwkFwNjermYSG_wekDR0y8ZqMMtoLN1GUleYdZXGFhGoude7yXyJ1YJJBAxUonuz1rlYj9hVHwrhNTnyTBRaX7aOLrYe9_uRMfHFno7njIxFFwBej3u8iBSwVepuR51sUzBZdxu34z1HrOtgK0fOW3s7qm_gP_vnj-8iW_cpCHoOO1u5c0g; REFRESH-TOKEN=eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.pbx4uPuCYNoDBHnmji1AQmcsmkMNiwjnFnTV0a3nVHoCbCSRFUSEFBQ1qlSzOE-eDazH2qJeHmeTbrRBzylt5J374m9FQpxuI76arbMTI8hIcfyERnvLfcpScC2fH2iIotETKzz2RDmxYLg-H5vdxczzH2E8__WEX6NYO5ajH8dIlDVyOQTto_JX0NIrx6utYkWQMEhhOmE24V-O7AlVkaGxImnQr7S42SAF_tzrPhUBykhU8jnrGTZov3_QEC-x_hMSw7CL3cAm1gAfMKmlcpxFBHiDJ2pLceU_kizs7l6Hlq32AR29H7tAYzhwrEGwXyfYy_Mj_jpTuo6mYPCGGw.cNiu_C2INptA735h._6aaLRQgJF9q36FSMLcnhwJZbD0rsp8_XM1meCrlI_TVPXonaXzCQ6kWSCT_qO2jx0J7NW32_-yoL5H3cEuxF0vLOScsB8IlRNcpnN6hOO9c4YMHY8tfhwsvGg0pm8y77CK6C8CRUk2t-AQVqbnvVuuKdbiOe-_Fv8Kn1Q6C1z7TbdttfkI-mwFfj5j_Ez6h8myJP3sh2ISO_Lcd-TRjhilMIRyj1mvha8vW18HDg_zObE8Cp6qTzzxuMtMMyClhaRi2bfS7-YPtnwAb2xBGf0ZZJW6T2Ez8oKBU2MB1ChiW5K9j6-itfgLkgdljtkwi6aspJua7ONQvXNoUMYRmDCTdmSRCLfyRPf1FGFlS1GYZ2ME7lGFgwIPmKL6UcvgMp7uNYKgX9A5bM_S9J3Ajqclm7PvfEUSoGf6LWofne9yFKRegwY1MW-1vpRqynLM3yYF7bCG1HWOnuCeKIDa6mv2xCIeK2wA13USsP9KhohZdCrbPHkN0aPJyJLjH4VCnFi5sAdzccp7ghSksCd3X9b2DwMFZ5AkICkLS83I7FulPfkJ_vgR95duQbMkhVbJbzWYoId064cRygpyWjL6ZqBKXD-oNzZHYKhgELxfK8BaT-rUBeJG3upTxp3t74VmNHSxs-Npvls6hopFgwT_SU_RrDlgbFU14vcA1O_wG50Q07VsM4ZQvjrLl51F426PxZ_D7ilLdJRUHrMVGaMfVE-n6r59MUwSt_FymduZqS70CMh1LYI3p6Re-Mvv3R5cQ0t0qyqomIuF0Y27VpOGRtQeHoji_Nfa0nICBw0tm2715MjmleGMdVbeCEHen-qm0z5-2ZFU_RXtg0o-8vJg0aqZag0WzzUedk9hi6bMa3ftkaXqkyr3n2AVU3dsfg06Ye7IfBu0iXpGP6UbblUg5chS6Sb0dmTdqY7UIvyv6uIf9RvMO0lIF5kgTBB7qY_Idgc_pmZoE7p41eOzsCgpPJ0jHKZ1wOZmhk3NCYBfAr1E-XMMQ3tCGlvSRS1rniPn0tyhaGglzLwt5TY1f6ef3v-qglTXljOPiimuVQ_evTHMXmXnduq9cpPVwVCfl6zR5K48VhKua8LwU6hoTkiWsiYBmqE9JKhGP-jVOY0s2HR3OJjcMfJFKzfP_Y0A13ug40h0NXkyZ73O8FGD5pFPvNZ7FvZDgISf5UeJy-4oiF46lvPaS-xQjyfC83lUDhUh7J5ozEodYLxz6262X81qTU_diIJpKdaSx_A.WYc9CYRk-hnfXg5wxdO7Nw; ACCESS-TOKEN=eyJraWQiOiJFU1pXaFhyOG0xZ3JJVXdZd3JiRFBkQnJ3YVdNTWhsNkhZbnVWajdvblNnPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJmNGI2M2Q2OS00NGVmLTRlNjItODYwNy1lZDdkMmI1ZTZjYTgiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1zb3V0aC0xX1Z4QnF6bUpNRV9Pa3RhIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb21cL2FwLXNvdXRoLTFfVnhCcXptSk1FIiwidmVyc2lvbiI6MiwiY2xpZW50X2lkIjoiMTJzbTk3M2ZwNGg2bW9nZWczbTA2ZnUxZmgiLCJvcmlnaW5fanRpIjoiMmQ0NTg3OGUtZTBlNi00OGNmLWJjNzMtNzJmNWI5NzdhYjc3IiwidG9rZW5fdXNlIjoiYWNjZXNzIiwic2NvcGUiOiJwaG9uZSBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTY4NDU2MDkwNywiZXhwIjoxNjg0NTY0NTA3LCJpYXQiOjE2ODQ1NjA5MDcsImp0aSI6ImRiYWNiMmExLTVlMGMtNDk2OC1hZGExLWYyODRlM2IxODk2NCIsInVzZXJuYW1lIjoiT2t0YV90dXNoYXIuc2FoYUBuYXZpLmNvbSJ9.Kta14y_fU6kTW3zBNZnA1OVWxXBWQlu1Vl95CRytkXDLv0j56y6XOtjjcwfiwFy5WxqYr4wCz_QZZlBlEYnwwzlVRElJt7KdJLYBicLRXUxG0CnwI3BWFMVx_oVBiucrqO_YQP2A49G5pP-1N5RW7yS-nEfIr87UVx_i_JLIjO9-N7uzJ3QcsuuQLjN_HQSARSZyJNCrz3qHXI8EGHOWwMoAzizwuucUU9GdsObBUpVCBT8NQ9ewv9aPFdm4OqqTYv1nJg-T1xzga_t8Xk1RTmSk7COS81ALF1MmEEvEuRIPa3jOG2PKfSVJUEGg3SQH1xYX2YJQ9iez-ycawJpffw; COGNITO-ENABLED=True; ACCESS-TOKEN=eyJraWQiOiJFU1pXaFhyOG0xZ3JJVXdZd3JiRFBkQnJ3YVdNTWhsNkhZbnVWajdvblNnPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIxNmNmZTlhNi03OTRhLTRlNWQtYjk4Ni1mOTQ2MWI0ZTRmOTYiLCJjb2duaXRvOmdyb3VwcyI6WyJhcC1zb3V0aC0xX1Z4QnF6bUpNRV9Pa3RhIl0sImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb21cL2FwLXNvdXRoLTFfVnhCcXptSk1FIiwidmVyc2lvbiI6MiwiY2xpZW50X2lkIjoiMTJzbTk3M2ZwNGg2bW9nZWczbTA2ZnUxZmgiLCJvcmlnaW5fanRpIjoiM2RmOTBmNWUtODhhZS00YjM0LTk5NDItZjgyMDBhMDE2MmRlIiwidG9rZW5fdXNlIjoiYWNjZXNzIiwic2NvcGUiOiJwaG9uZSBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTY4MjMxNDQxMCwiZXhwIjoxNjg0NTY0NjU0LCJpYXQiOjE2ODQ1NjEwNTQsImp0aSI6Ijk4OTMxZmY4LTJhMzQtNGVmZi05ZWQzLWFhMWVjM2RlYTFmNiIsInVzZXJuYW1lIjoiT2t0YV9yb2hpdC5wYW5kaXRAbmF2aS5jb20ifQ.vZLf6WpMi01_jDBevS5eraQSHQkg4bhCZ8Rac3Pdl72gDs08gqwdH15kXbu-hkJzvgnvO4-0QUpCIKNYHK6GUGIVKEjUSdI-2MB5peK41Ultka7D-AuK3Hw2eom4zru5fupjIiJ479LpaXyarRSxdly68FRzjJauN0HEweaLrpCZFWOsKnDOza9EdudX5_lDoCeBKQa5GEh53sUniEtKa5C4nmHj6yLtw0i1HDNyI6ZRllU5ZsL3jE-ylvMjl3jNjli_3v4yTGhP1GRYO7Ca5kyMFPj1Hy1F7A96lL4FFwSTHY4vUg2mfjB6nwN_kOwoBf20bQtpTfWwUTwy2I02ZA; COGNITO-ENABLED=True; ID-TOKEN=eyJraWQiOiJhMFVucVpSQndieEZOczBmMGhQKzhrczRIZUF2bnNJSGhienEwZWJzNTdvPSIsImFsZyI6IlJTMjU2In0.eyJhdF9oYXNoIjoiTHlHTElWVVNBTldzZ29qX29WeGVQQSIsInN1YiI6IjE2Y2ZlOWE2LTc5NGEtNGU1ZC1iOTg2LWY5NDYxYjRlNGY5NiIsImNvZ25pdG86Z3JvdXBzIjpbImFwLXNvdXRoLTFfVnhCcXptSk1FX09rdGEiXSwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAuYXAtc291dGgtMS5hbWF6b25hd3MuY29tXC9hcC1zb3V0aC0xX1Z4QnF6bUpNRSIsImNvZ25pdG86dXNlcm5hbWUiOiJPa3RhX3JvaGl0LnBhbmRpdEBuYXZpLmNvbSIsIm9yaWdpbl9qdGkiOiIzZGY5MGY1ZS04OGFlLTRiMzQtOTk0Mi1mODIwMGEwMTYyZGUiLCJhdWQiOiIxMnNtOTczZnA0aDZtb2dlZzNtMDZmdTFmaCIsImlkZW50aXRpZXMiOlt7InVzZXJJZCI6InJvaGl0LnBhbmRpdEBuYXZpLmNvbSIsInByb3ZpZGVyTmFtZSI6Ik9rdGEiLCJwcm92aWRlclR5cGUiOiJTQU1MIiwiaXNzdWVyIjoiaHR0cDpcL1wvd3d3Lm9rdGEuY29tXC9leGtjamJvNWY2NWlJV2pkODM1NyIsInByaW1hcnkiOiJ0cnVlIiwiZGF0ZUNyZWF0ZWQiOiIxNjc1MjM3ODMxMDc1In1dLCJ0b2tlbl91c2UiOiJpZCIsImF1dGhfdGltZSI6MTY4MjMxNDQxMCwiZXhwIjoxNjg0NTY0NjU0LCJpYXQiOjE2ODQ1NjEwNTQsImp0aSI6IjE2MzIxMjU3LWE4Y2UtNDYwZi04ZGJiLTU3YzBiNTNkMTcxMCIsImVtYWlsIjoicm9oaXQucGFuZGl0QG5hdmkuY29tIn0.svzpyKNDNdWggH6-WR83Nn2bmrLPMkSlO_4FvOTNlaoJd2D-Pn1aoVg6K74L-WtxgfSzmI6-xyvr4KcB-RIFk7EuHH3KlEiXz36RvkT7HNgzF0tNrxRq_xHd4WoFmsFgFlgut0S8jnWzzXQNsmNZ6b4Jjl7LRtJQxPOQ8EvDo4tYEtzHWaM1K1na1Qu7eCTP073vL_hxABMhYQHXi8cVUS-dv4qfFC8DlqoHzatAn1yADsvDwmeieXm6xZQN5IEYUJvvgnvA9xBIkqf_mLbP4-w8UfkUnb4_N3EEPKJNgo-6qT1ThIKJHn-Y19w-uNpPdvb4HIniX2rcPk4sbrYijA; REFRESH-TOKEN=eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.pSuUimCj6fANd-z1MCvkFbGepeX7nSCLmrqYhQe23gyJQv5JfzifjtSMjU6RzzYK7ERMitGUG0We4r2-GEp2jNic8LcFjM11H1qPpRJN3dvf1fqNpaQOU8sojtZIJI7Nzst_4z0CLKqlhv-GLIRqEN3ZslpRm_jjiLfCQFX_knQCuSXQmKTYxG11d13g5I6di7dQdYrperxR-gIKRP-CXbZZwQUZK8vjtx5XV5tTGdjGXOTbmL591s4nZfYWoUdqPqQxpBQ3GMiaNtORH9eu6d4JSYX8y5ucN4UIle38D0U5756mGEQ2gfX_tDuJt3ee5dQYzt5i0AhNFh2kPSiujw.tYS9ZEfyPi1tPyAW.GCtOK0-QEtztTY6o0eyz23YJMmJBAqafuhzZczUYoEfEfCAZTamNCnDSp47nDCvOzfaYeVyyecDgSXK36sc8Sf9jDHnZCUN-Be7t_AiKUb1CpNcsMR4hhRsEYiAzsewElsvWrPG2cgY3ikYruoBe_dN675ReIfLBmPUvh8pLJi50Xaj2mrFfnOZRAWU64lMAU29SGHYRfbMidUCT15j2p8gscn1FOUal_UluMT1fLST1JtwVhb28eBPfbabf5ckn2GMZ2fhWGyN2_giku1GWA1LbzSFgF1w9UBHvVwSsDlVrPbdMEE1Vj0W55qu0ATbR1bSYOFbtMaBHNCIj0LehjOL-a47_BIBRgCSySFQ-2evBm1qPn7xfbOvx8VAKkb4rZ5c0RehR4jrVtbb1K8jW7ppni2r7x8DwaBwm3PxLKT_Stvvqkp3Rac9NsaKL2u1DQgarsHr0n5MUQlCaLxcAxgF57c-tm7u5gca3p_L3YFfupsOsFes3-DHyQno9OrvWtDk9lkb5SGGoMcY0dkkpzfwi2y2UruQFlntlr8QOxz2ZVzqrl9dRwIN1u9ivdNtLsBBLYVrAU1o2k88MNQSIquu_QB7r4llHK2OfH17QTanTusti_hH0PbtJn4irodBg-dl4Hbd5YA148-XHp-_48W18bqZTansFZQmx_5E4ZVlfOSTayBD5VkpQM0S9dL4_N58pH7s2XrNE4_WQJQqoA5vh8S2LvPXMrtcsUkmIbIvvXwf3PELlYXtIWcdDvA2zRmfKnhH3ftmL7fGWWx0UVYkhU14iWXmmSrJ2amtfxBIH9S43Z7Rn-2uhaVLIHgBdnANxMJVKTeDMTtyWznfccVAo2apjTG6zEpDgKjr1dil0mWiouQwgpGpwkHYZ1fyx7bOI_7qyFC9Y7pUFNBver0qIaWv8NDbhAVXc86JOWZdrrCrwg8BmcHF6b_cDWR6m_eEzeO0srOyCds-VqPPLioyqJf9RVLC4WhOwMwkytgn4-ATPt6G5wNAtvvl7nOjg_qlT8IssbOWojdTT9-IyKCn0hzFI1TPInkdIG5AU1EoyXhgKBaroz3q9ukgRVwc6bgpM3TgAbwLF5XafuFYMVLVAs_w4Hpyzg4qkJ18oGmqXFMGU_dHxOCA907giqeig8wObnReLjuqTRK8dLvEDBanugFcp8hAsQ7hse-vsgK9X-lbiqNtDBKzFvCHsBkRhtRQ1DTxlw2CkNSbAk7aVmqh6ewnrrS68TDI.Q90TfeDUy8AZeI8ooX0JpA") - req.Header.Set("kbn-version", "7.10.2") - req.Header.Set("origin", "https://vpc-sa-prod-isieo6nwenbw3jsdbhxgdx4l4m.ap-south-1.es.amazonaws.com") - req.Header.Set("referer", "https://vpc-sa-prod-isieo6nwenbw3jsdbhxgdx4l4m.ap-south-1.es.amazonaws.com/_plugin/kibana/app/opendistro-alerting") - req.Header.Set("sec-ch-ua", `"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"`) - req.Header.Set("sec-ch-ua-mobile", "?0") - req.Header.Set("sec-ch-ua-platform", `"macOS"`) - req.Header.Set("sec-fetch-dest", "empty") - req.Header.Set("sec-fetch-mode", "cors") - req.Header.Set("sec-fetch-site", "same-origin") - req.Header.Set("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36") - resp, err := client.Do(req) - if err != nil { - log.Fatal(err) - } - defer resp.Body.Close() - bodyText, err := io.ReadAll(resp.Body) - if err != nil { - log.Fatal(err) - } - var anyJson AutoGenerated - err = json.Unmarshal(bodyText, &anyJson) - if err != nil { - fmt.Println(err.Error()) - } - var result bytes.Buffer - result.WriteString(anyJson.Resp.MonitorName) - result.WriteString("\n>") - for _, inputResult := range anyJson.Resp.InputResults.Results { - for _, hits := range inputResult.Hits.Hits { - result.WriteString("Service name : ") - result.WriteString(hits.Source.LogProcessed.ServiceName) - result.WriteString(" " + hits.Source.LogProcessed.LogLevel) - result.WriteString(" " + hits.Source.LogProcessed.Message) - } - result.WriteString("\n>") - } - return result.String() -} - -type Response struct { - Name string `json:"name"` - Pokemon []Pokemon `json:"pokemon_entries"` -} - -type Pokemon struct { - PokemonSpecies PokemonSpecies `json:"pokemon_species"` -} - -type PokemonSpecies struct { - Name string `json:"name"` -} - -type AutoGenerated struct { - Ok bool `json:"ok"` - Resp struct { - MonitorName string `json:"monitor_name"` - PeriodStart int64 `json:"period_start"` - PeriodEnd int64 `json:"period_end"` - Error interface{} `json:"error"` - InputResults struct { - Results []struct { - Shards struct { - Total int `json:"total"` - Failed int `json:"failed"` - Successful int `json:"successful"` - Skipped int `json:"skipped"` - } `json:"_shards"` - Hits struct { - Hits []struct { - Index string `json:"_index"` - Type string `json:"_type"` - Source struct { - LogProcessed struct { - ServiceName string `json:"service.name"` - Message string `json:"message"` - LogLogger string `json:"log.logger"` - TransactionID string `json:"transaction.id"` - TraceID string `json:"trace.id"` - Timestamp time.Time `json:"@timestamp"` - ErrorType string `json:"error.type"` - ErrorMessage string `json:"error.message"` - ErrorID string `json:"error.id"` - LogLevel string `json:"log.level"` - ErrorStackTrace string `json:"error.stack_trace"` - LabelsClickStream string `json:"labels.click-stream"` - ProcessThreadName string `json:"process.thread.name"` - } `json:"log_processed"` - Timestamp time.Time `json:"@timestamp"` - ContainerName string `json:"container_name"` - Stream string `json:"stream"` - Time time.Time `json:"time"` - Tag string `json:"tag"` - PodName string `json:"pod_name"` - NamespaceName string `json:"namespace_name"` - } `json:"_source"` - ID string `json:"_id"` - Score int `json:"_score"` - } `json:"hits"` - Total struct { - Value int `json:"value"` - Relation string `json:"relation"` - } `json:"total"` - MaxScore int `json:"max_score"` - } `json:"hits"` - Took int `json:"took"` - TimedOut bool `json:"timed_out"` - Aggregations struct { - Num2 struct { - DocCountErrorUpperBound int `json:"doc_count_error_upper_bound"` - SumOtherDocCount int `json:"sum_other_doc_count"` - Buckets []struct { - Num3 struct { - DocCountErrorUpperBound int `json:"doc_count_error_upper_bound"` - SumOtherDocCount int `json:"sum_other_doc_count"` - Buckets []struct { - DocCount int `json:"doc_count"` - Key string `json:"key"` - } `json:"buckets"` - } `json:"3"` - DocCount int `json:"doc_count"` - Key string `json:"key"` - } `json:"buckets"` - } `json:"2"` - } `json:"aggregations"` - } `json:"results"` - Error interface{} `json:"error"` - } `json:"input_results"` - TriggerResults struct { - } `json:"trigger_results"` - } `json:"resp"` -} diff --git a/internal/diagnostic/models/entity/DeploymentConfigEntity.go b/internal/diagnostic/models/entity/DeploymentConfigEntity.go deleted file mode 100644 index 6bbe658..0000000 --- a/internal/diagnostic/models/entity/DeploymentConfigEntity.go +++ /dev/null @@ -1,15 +0,0 @@ -package entity - -import "gorm.io/gorm" - -type DeploymentConfigEntity struct { - gorm.Model - AlertId string `gorm:"column:alert_id"` - ManifestId string `gorm:"column:manifest_id"` - DeploymentPortalUrl string `gorm:"column:deployment_portal_url"` - Priority int `gorm:"column:priority"` -} - -func (DeploymentConfigEntity) TableName() string { - return "deployment_config_mapping" -} diff --git a/internal/diagnostic/models/entity/DeploymentDiagnosticEntity.go b/internal/diagnostic/models/entity/DeploymentDiagnosticEntity.go deleted file mode 100644 index d146ad0..0000000 --- a/internal/diagnostic/models/entity/DeploymentDiagnosticEntity.go +++ /dev/null @@ -1,15 +0,0 @@ -package entity - -import "gorm.io/gorm" - -type DeploymentDiagnosticEntity struct { - gorm.Model - AlertId string `gorm:"column:alert_id"` - ServiceName string `gorm:"column:service_name"` - DeploymentPortalUrl string `gorm:"column:deployment_portal_url"` - Priority int `gorm:"column:priority"` -} - -func (DeploymentDiagnosticEntity) TableName() string { - return "deployment_mapping" -} diff --git a/internal/diagnostic/models/entity/DiagnoseEntity.go b/internal/diagnostic/models/entity/DiagnoseEntity.go deleted file mode 100644 index f487a15..0000000 --- a/internal/diagnostic/models/entity/DiagnoseEntity.go +++ /dev/null @@ -1,15 +0,0 @@ -package entity - -import "gorm.io/gorm" - -type DiagnoseEntity struct { - gorm.Model - AlertId string `gorm:"column:alert_id"` - AlertName string `gorm:"column:alert_name` - Description string `gorm:"column:description` - IsActive bool `gorm:"column:is_active"` -} - -func (DiagnoseEntity) TableName() string { - return "diagnose_runbook" -} diff --git a/internal/diagnostic/models/entity/DiagnosticConfig.go b/internal/diagnostic/models/entity/DiagnosticConfig.go deleted file mode 100644 index 9356433..0000000 --- a/internal/diagnostic/models/entity/DiagnosticConfig.go +++ /dev/null @@ -1 +0,0 @@ -package entity diff --git a/internal/diagnostic/models/entity/EventNameMapping.go b/internal/diagnostic/models/entity/EventNameMapping.go deleted file mode 100644 index f65086e..0000000 --- a/internal/diagnostic/models/entity/EventNameMapping.go +++ /dev/null @@ -1,14 +0,0 @@ -package entity - -import "gorm.io/gorm" - -type GrafanaDiagnosticEntity struct { - gorm.Model - AlertId string `gorm:"column:alert_id"` - EndpointUrl string `gorm:"column:endpoint_url"` - Priority int `gorm:"column:priority"` -} - -func (GrafanaDiagnosticEntity) TableName() string { - return "grafana_mapping" -} diff --git a/internal/diagnostic/models/entity/KibanaDiagnosticEntity.go b/internal/diagnostic/models/entity/KibanaDiagnosticEntity.go deleted file mode 100644 index d46069a..0000000 --- a/internal/diagnostic/models/entity/KibanaDiagnosticEntity.go +++ /dev/null @@ -1,15 +0,0 @@ -package entity - -import "gorm.io/gorm" - -type KibanaDiagnosticEntity struct { - gorm.Model - AlertId string `gorm:"column:alert_id"` - KibanaLink string `gorm:"column:kibana_link"` - Priority int `gorm:"column:priority"` - CustomQuery string `gorm:"column:custom_query"` -} - -func (KibanaDiagnosticEntity) TableName() string { - return "kibana_mapping" -} diff --git a/internal/diagnostic/models/gocdModel.go b/internal/diagnostic/models/gocdModel.go deleted file mode 100644 index c0a5714..0000000 --- a/internal/diagnostic/models/gocdModel.go +++ /dev/null @@ -1,23 +0,0 @@ -package models - -type GoCdResponse struct { - PipelineName string `json:"pipelineName,omitempty"` - Groups []GoCdGroups `json:"groups,omitempty"` -} - -type GoCdGroups struct { - History []GoCdPipelineRun `json:"history,omitempty"` -} - -type GoCdPipelineRun struct { - BuildCause string `json:"buildCauseBy,omitempty"` - ScheduledDate string `json:"scheduled_date,omitempty"` - Stages []GoCdStageRun `json:"stages,omitempty"` -} - -type GoCdStageRun struct { - Name string `json:"stageName,omitempty"` - StageCounter string `json:"stageCounter,omitempty"` - StageStatus string `json:"stageStatus,omitempty"` - ScheduledDate string `json:"scheduled_date,omitempty"` -} diff --git a/internal/diagnostic/models/runbook.go b/internal/diagnostic/models/runbook.go deleted file mode 100644 index 3ffffd9..0000000 --- a/internal/diagnostic/models/runbook.go +++ /dev/null @@ -1,8 +0,0 @@ -package models - -type Runbook struct { - links []string // links to be shown in the printed runbook on slack - TextSnippets []string // snippets to be shown in printed runbook on slack - ImagePaths []string // images that needs to be shown in the runbook - filePaths []string // if any files needs to be uploaded along with the runbook -} diff --git a/internal/diagnostic/screenshot.go b/internal/diagnostic/screenshot.go deleted file mode 100644 index af0df81..0000000 --- a/internal/diagnostic/screenshot.go +++ /dev/null @@ -1,138 +0,0 @@ -package diagnostic - -import ( - "context" - "fmt" - "github.com/google/uuid" - "github.com/joho/godotenv" - "github.com/spf13/viper" - "go.uber.org/zap" - "houston/config" - "houston/logger" - "houston/pkg/s3" - "image" - "io" - "net/http" - "os" - "path/filepath" - "time" - - "github.com/chromedp/cdproto/network" - "github.com/chromedp/chromedp" -) - -func getImageFromFilePath(filePath string) (image.Image, error) { - f, err := os.Open(filePath) - if err != nil { - return nil, err - } - defer f.Close() - image, _, err := image.Decode(f) - return image, err -} - -func TakeScreenshotAndUpload(repo *Repository, alertId string) []string { - grafanaLinks, _ := repo.GetGrafanaLinksForAlert(alertId) - logger.Info("taking screenshot") - fileLinkList := make([]string, 0) - for _, links := range grafanaLinks { - takeScreenShotUrl(&fileLinkList, links.EndpointUrl) - } - return fileLinkList -} - -func takeScreenShotUrl(fileList *[]string, url string) { - req, err := http.NewRequest("GET", url, nil) - if err != nil { - logger.Error(err.Error()) - } - token := fmt.Sprintf("Bearer %s", viper.GetString("grafana.token")) - req.Header.Set("Authorization", token) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - logger.Error(err.Error()) - } - id := uuid.New() - if err := os.MkdirAll("images", os.ModePerm); err != nil { - logger.Error(err.Error()) - } - fileName := "images/" + id.String() + ".jpg" - file, err := os.Create(fileName) - if err != nil { - logger.Error(err.Error()) - } - defer file.Close() - _, err = io.Copy(file, resp.Body) - link, err := upload(fileName) - if err != nil { - return - } - - os.Remove(fileName) - *fileList = append(*fileList, link) -} - -func takeScreenShot(fileList *[]string, url string) { - ctx, cancel := chromedp.NewContext(context.Background()) - defer cancel() - - var buf []byte - if err := chromedp.Run(ctx, setHeaders(url, &buf)); err != nil { - logger.Fatal(err.Error()) - } - id := uuid.New() - if err := os.MkdirAll("images", os.ModePerm); err != nil { - logger.Fatal(err.Error()) - } - fileName := "images/" + id.String() + ".jpg" - if err := os.WriteFile(fileName, buf, 0644); err != nil { - logger.Fatal(err.Error()) - } - link, err := upload(fileName) - if err != nil { - logger.Error("failed", zap.Error(err)) - return - } - os.Remove(fileName) - *fileList = append(*fileList, link) -} - -func upload(fileName string) (string, error) { - s3Operations := s3.NewS3Operations() - s3BucketName := viper.GetString("S3_BUCKET_NAME") - output, uploadErr := s3Operations.UploadFile(s3BucketName, filepath.Join(), fileName, fileName) - if uploadErr != nil { - logger.Info("upload failed for grafana screenshot") - logger.Error(uploadErr.Error()) - logger.Error("upload failed", zap.Error(uploadErr), zap.Any("output", output)) - return "", uploadErr - } - link, err := s3Operations.GetFileLink(s3BucketName, fileName) - if err != nil { - logger.Error("upload failed", zap.Error(err), zap.Any("output", output)) - return "", err - } - - logger.Info("upload success", zap.String("link", link), zap.Any("s3_output", output), zap.Error(err)) - return link, nil -} - -func setHeaders(host string, imageBuf *[]byte) chromedp.Tasks { - config.LoadHoustonConfig() - godotenv.Load() - token := fmt.Sprintf("Bearer %s", viper.GetString("grafana.token")) - headers := map[string]interface{}{ - "Authorization": token, - } - return chromedp.Tasks{ - network.Enable(), - network.SetExtraHTTPHeaders(headers), - chromedp.Navigate(host), //chromedp.WaitVisible(`#reactRoot > div > main > div:nth-child(3) > div > div > div > div > div > div > div > div > div:nth-child(33) > div > section > div:nth-child(2)`), - chromedp.Sleep(5 * time.Second), // chromedp.WaitVisible(`body`, chromedp.BySearch), - chromedp.ActionFunc(func(context.Context) error { - return nil - }), - chromedp.FullScreenshot(imageBuf, 95), - } -} diff --git a/internal/processor/action/diagnostic_command_action.go b/internal/processor/action/diagnostic_command_action.go deleted file mode 100644 index 24f95b2..0000000 --- a/internal/processor/action/diagnostic_command_action.go +++ /dev/null @@ -1,102 +0,0 @@ -package action - -import ( - "github.com/slack-go/slack/socketmode" - "go.uber.org/zap" - "houston/internal/diagnostic" - "houston/internal/diagnostic/models" -) - -type DiagnosticCommandActionHandler interface { - HandleAction(e *socketmode.Event, alertname string) models.Runbook -} - -type HandlerData struct { - logger *zap.Logger - client *socketmode.Client - repository *diagnostic.Repository -} - -type GrafanaActionHandler struct { - grafanaHandlerData HandlerData -} - -type KibanaActionHandler struct { - kibanaHandlerData HandlerData -} - -type DeploymentPortalHandler struct { - deploymentPortalHandlerData HandlerData -} - -type DeploymentConfigHandler struct { - deploymentConfigHandlerData HandlerData -} - -func NewGrafanaActionHandler(client *socketmode.Client, repository *diagnostic.Repository) *GrafanaActionHandler { - return &GrafanaActionHandler{ - grafanaHandlerData: HandlerData{ - - client: client, - repository: repository, - }, - } -} - -func NewKibanaActionHandler(client *socketmode.Client) *KibanaActionHandler { - return &KibanaActionHandler{ - kibanaHandlerData: HandlerData{ - client: client, - }, - } -} - -func NewDeploymentPortalActionHandler(client *socketmode.Client, repository *diagnostic.Repository) *DeploymentPortalHandler { - return &DeploymentPortalHandler{ - deploymentPortalHandlerData: HandlerData{ - - client: client, - repository: repository, - }, - } -} - -func NewDeploymentConfigActionHandler(client *socketmode.Client, repository *diagnostic.Repository) *DeploymentConfigHandler { - return &DeploymentConfigHandler{ - deploymentConfigHandlerData: HandlerData{ - - client: client, - repository: repository, - }, - } -} - -func (gah *GrafanaActionHandler) HandleAction(e *socketmode.Event, alertName string) models.Runbook { - imagePaths := diagnostic.TakeScreenshotAndUpload(gah.grafanaHandlerData.repository, alertName) - var runbook models.Runbook - runbook.ImagePaths = imagePaths - return runbook -} - -func (kah *KibanaActionHandler) HandleAction(e *socketmode.Event, alertName string) models.Runbook { - var runbook models.Runbook - kibanaResponse := diagnostic.GetKibana() - kibanaResponseArray := make([]string, 0) - kibanaResponseArray = append(kibanaResponseArray, kibanaResponse) - runbook.TextSnippets = kibanaResponseArray - return runbook -} - -func (dph *DeploymentPortalHandler) HandleAction(e *socketmode.Event, alertName string) models.Runbook { - var runbook models.Runbook - deploymentDetails := diagnostic.DeploymentPortalHandler(dph.deploymentPortalHandlerData.repository, alertName) - runbook.TextSnippets = deploymentDetails - return runbook -} - -func (dph *DeploymentConfigHandler) HandleAction(e *socketmode.Event, alertName string) models.Runbook { - var runbook models.Runbook - configDiff := diagnostic.DeploymentConfigHandler(dph.deploymentConfigHandlerData.repository, alertName) - runbook.TextSnippets = configDiff - return runbook -} diff --git a/internal/processor/slash_command_processor.go b/internal/processor/slash_command_processor.go index c338e6e..d2a1354 100644 --- a/internal/processor/slash_command_processor.go +++ b/internal/processor/slash_command_processor.go @@ -2,16 +2,11 @@ package processor import ( "fmt" - "github.com/slack-go/slack" "github.com/slack-go/slack/socketmode" - "go.uber.org/zap" - "houston/internal/diagnostic" - "houston/internal/diagnostic/models" "houston/internal/processor/action" "houston/logger" "houston/pkg/slackbot" rcaService "houston/service/rca/impl" - "strings" ) type CommandProcessor interface { @@ -23,24 +18,6 @@ type SlashCommandProcessor struct { slashCommandAction *action.HoustonCommandAction } -type DiagnosticCommandProcessor struct { - logger *zap.Logger - socketModeClient *socketmode.Client - diagnosticCommandActions []action.DiagnosticCommandActionHandler -} - -func NewDiagnosticCommandProcessor(socketModeClient *socketmode.Client, repository *diagnostic.Repository) *DiagnosticCommandProcessor { - return &DiagnosticCommandProcessor{ - socketModeClient: socketModeClient, - diagnosticCommandActions: []action.DiagnosticCommandActionHandler{ - action.NewDeploymentConfigActionHandler(socketModeClient, repository), - action.NewGrafanaActionHandler(socketModeClient, repository), - //action.NewKibanaActionHandler(logger, socketModeClient), - action.NewDeploymentPortalActionHandler(socketModeClient, repository), - }, - } -} - func NewSlashCommandProcessor( socketModeClient *socketmode.Client, slackBot *slackbot.Client, @@ -61,50 +38,3 @@ func (scp *SlashCommandProcessor) ProcessSlashCommand(event *socketmode.Event) { scp.slashCommandAction.PerformAction(event) } - -func (dcp *DiagnosticCommandProcessor) ShouldProcessCommand(text string) bool { - commands := strings.Split(text, " ") - return len(commands) > 0 && commands[0] == "diagnose" -} - -func (dcp *DiagnosticCommandProcessor) ProcessSlashCommand(e *socketmode.Event) { - dcp.socketModeClient.Ack(*e.Request, nil) - - _, ok := e.Data.(slack.SlashCommand) - if !ok { - logger.Error("Unable to convert event to slash command", zap.Any("event", e)) - return - } - cmd := e.Data.(slack.SlashCommand) - postAckMessage(&dcp.socketModeClient.Client, &cmd) - commands := strings.Split(cmd.Text, " ") - runbooks := make([]models.Runbook, 0) - for _, actionHandler := range dcp.diagnosticCommandActions { - runbooks = append(runbooks, actionHandler.HandleAction(e, commands[1])) - } - diagnosticDataAssembler := diagnostic.NewDiagnosticDataAssembler2() - image, text := diagnosticDataAssembler.HandleData(runbooks) - postDataOnSlack(&dcp.socketModeClient.Client, &cmd, &image, text) - - logger.Error("S3 upload failed", zap.Any("error", e)) -} - -func postDataOnSlack(api *slack.Client, sh *slack.SlashCommand, message *slack.MsgOption, attachments []slack.Attachment) { - y, x, err := api.PostMessage( - sh.ChannelID, - *message, - slack.MsgOptionAttachments(attachments...), - ) - if err != nil { - fmt.Printf("error occured %s", err) - } - fmt.Println(y, x) -} - -func postAckMessage(api *slack.Client, sh *slack.SlashCommand) { - textBlock := slack.NewTextBlockObject("mrkdwn", fmt.Sprintf("Your request has been acknowledged for\n> %s", sh.Text), false, false) - block := slack.NewSectionBlock(textBlock, nil, nil) - var messageBlock slack.MsgOption - messageBlock = slack.MsgOptionBlocks(block) - postDataOnSlack(api, sh, &messageBlock, nil) -} diff --git a/internal/resolver/houston_command_resolver.go b/internal/resolver/houston_command_resolver.go index fde536e..b5587f9 100644 --- a/internal/resolver/houston_command_resolver.go +++ b/internal/resolver/houston_command_resolver.go @@ -14,23 +14,20 @@ import ( ) type HoustonCommandResolver struct { - diagnosticCommandProcessor *processor.DiagnosticCommandProcessor - socketModeClient *socketmode.Client - slackBotClient *slackbot.Client - rcaService *rcaService.RcaService + socketModeClient *socketmode.Client + slackBotClient *slackbot.Client + rcaService *rcaService.RcaService } func NewHoustonCommandResolver( - diagnosticCommandProcessor *processor.DiagnosticCommandProcessor, socketModeClient *socketmode.Client, slackBotClient *slackbot.Client, rcaService *rcaService.RcaService, ) *HoustonCommandResolver { return &HoustonCommandResolver{ - diagnosticCommandProcessor: diagnosticCommandProcessor, - socketModeClient: socketModeClient, - slackBotClient: slackBotClient, - rcaService: rcaService, + socketModeClient: socketModeClient, + slackBotClient: slackBotClient, + rcaService: rcaService, } } @@ -38,9 +35,6 @@ const logTag = "[houston_command_resolver]" func (resolver *HoustonCommandResolver) Resolve(evt *socketmode.Event) processor.CommandProcessor { cmd, _ := evt.Data.(slack.SlashCommand) - if resolver.diagnosticCommandProcessor.ShouldProcessCommand(cmd.Text) { - resolver.diagnosticCommandProcessor.ProcessSlashCommand(evt) - } logger.Info(fmt.Sprintf("%s received slash command [%s] from channel [%s] by user [%s]", logTag, fmt.Sprintf("%s %s", cmd.Command, cmd.Text), cmd.ChannelName, cmd.UserName)) params := strings.ToLower(cmd.Text) diff --git a/model/role/entity.go b/model/role/entity.go deleted file mode 100644 index 821bbde..0000000 --- a/model/role/entity.go +++ /dev/null @@ -1,12 +0,0 @@ -package role - -import "gorm.io/gorm" - -type RoleEntity struct { - gorm.Model - name string `gorm:"column:name"` -} - -func (RoleEntity) TableName() string { - return "role" -} diff --git a/model/role/role.go b/model/role/role.go deleted file mode 100644 index e5b9217..0000000 --- a/model/role/role.go +++ /dev/null @@ -1,34 +0,0 @@ -package role - -import ( - "fmt" - "houston/logger" - - "go.uber.org/zap" - "gorm.io/gorm" -) - -type Repository struct { - gormClient *gorm.DB -} - -func NewRoleRepository(gormClient *gorm.DB) *Repository { - return &Repository{ - gormClient: gormClient, - } -} - -func (r *Repository) FindRoleById(id int) (*RoleEntity, error) { - role := RoleEntity{} - tx := r.gormClient.Raw("select * from role where id = ?", id).Scan(&role) - - if tx.Error != nil { - logger.Error("Error while getting role", zap.String("exception", fmt.Sprintf("%v", tx.Error))) - return nil, tx.Error - } - if tx.RowsAffected == 0 { - return nil, nil - } - - return &role, nil -}