Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/supervisor/cmd/error-report.go
2498 views
1
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package cmd
6
7
import (
8
"bytes"
9
"context"
10
"encoding/json"
11
"fmt"
12
"net/http"
13
"net/url"
14
"os"
15
"time"
16
17
"github.com/gitpod-io/gitpod/supervisor/api"
18
log "github.com/sirupsen/logrus"
19
"github.com/spf13/cobra"
20
21
ide_metrics "github.com/gitpod-io/gitpod/ide-metrics-api"
22
)
23
24
var errorReportCmdOpts struct {
25
data string
26
}
27
28
// errorReportCmd represents the errorReportCmd command
29
var errorReportCmd = &cobra.Command{
30
Use: "error-report",
31
Long: "Sending error report to ide-metrics",
32
Hidden: true,
33
Args: cobra.ExactArgs(0),
34
Run: func(cmd *cobra.Command, args []string) {
35
file, err := os.OpenFile(os.TempDir()+"/supervisor-errors.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
36
if err == nil {
37
log.SetOutput(file)
38
defer file.Close()
39
} else {
40
log.SetLevel(log.FatalLevel)
41
}
42
43
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
44
defer cancel()
45
46
var data ide_metrics.ReportErrorRequest
47
err = json.Unmarshal([]byte(errorReportCmdOpts.data), &data)
48
if err != nil {
49
log.Fatal(err)
50
}
51
52
conn := dialSupervisor()
53
defer conn.Close()
54
wsInfo, err := api.NewInfoServiceClient(conn).WorkspaceInfo(ctx, &api.WorkspaceInfoRequest{})
55
if err != nil {
56
log.Fatal(err)
57
}
58
59
data.WorkspaceId = wsInfo.WorkspaceId
60
data.InstanceId = wsInfo.InstanceId
61
data.UserId = wsInfo.OwnerId
62
63
parsedUrl, err := url.Parse(wsInfo.GitpodHost)
64
if err != nil {
65
log.Fatal("cannot parse GitpodHost")
66
return
67
}
68
69
ideMetricsUrl := fmt.Sprintf("https://ide.%s/metrics-api/reportError", parsedUrl.Host)
70
71
payload, err := json.Marshal(data)
72
if err != nil {
73
log.WithError(err).Error("failed to marshal json while attempting to report error")
74
return
75
}
76
77
req, err := http.NewRequest("POST", ideMetricsUrl, bytes.NewBuffer(payload))
78
if err != nil {
79
log.WithError(err).Error("failed to init request for ide-metrics-api")
80
return
81
}
82
83
client := &http.Client{}
84
_, err = client.Do(req)
85
if err != nil {
86
log.WithError(err).Error("cannot report error to ide-metrics-api")
87
return
88
}
89
},
90
}
91
92
func init() {
93
rootCmd.AddCommand(errorReportCmd)
94
errorReportCmd.Flags().StringVarP(&errorReportCmdOpts.data, "data", "", "", "json data")
95
96
_ = errorReportCmd.MarkFlagRequired("data")
97
}
98
99