Error reports an error to the telemetry server.
(err error, meta Metadata)
| 139 | |
| 140 | // Error reports an error to the telemetry server. |
| 141 | func Error(err error, meta Metadata) { |
| 142 | errToLog := err // use errToLog to avoid shadowing err later. Use err to keep API clean. |
| 143 | |
| 144 | if !started || !usererr.ShouldLogError(errToLog) { |
| 145 | return |
| 146 | } |
| 147 | |
| 148 | nixVersion := cmp.Or(nix.Version(), "unknown") |
| 149 | |
| 150 | event := &sentry.Event{ |
| 151 | EventID: sentry.EventID(ExecutionID), |
| 152 | Level: sentry.LevelError, |
| 153 | User: sentry.User{ID: deviceID}, |
| 154 | Exception: newSentryException(redact.Error(errToLog)), |
| 155 | Contexts: map[string]map[string]any{ |
| 156 | "os": { |
| 157 | "name": build.OS(), |
| 158 | }, |
| 159 | "device": { |
| 160 | "arch": runtime.GOARCH, |
| 161 | }, |
| 162 | "runtime": { |
| 163 | "name": "Go", |
| 164 | "version": strings.TrimPrefix(runtime.Version(), "go"), |
| 165 | }, |
| 166 | "nix": { |
| 167 | "version": nixVersion, |
| 168 | }, |
| 169 | }, |
| 170 | } |
| 171 | if meta.Command != "" { |
| 172 | event.Tags = map[string]string{"command": meta.Command} |
| 173 | } |
| 174 | if sentryCtx := meta.cmdContext(); len(sentryCtx) > 0 { |
| 175 | event.Contexts["Command"] = sentryCtx |
| 176 | } |
| 177 | if sentryCtx := meta.envContext(); len(sentryCtx) > 0 { |
| 178 | event.Contexts["Devbox Environment"] = sentryCtx |
| 179 | } |
| 180 | if sentryCtx := meta.featureContext(); len(sentryCtx) > 0 { |
| 181 | event.Contexts["Feature Flags"] = sentryCtx |
| 182 | } |
| 183 | if sentryCtx := meta.pkgContext(); len(sentryCtx) > 0 { |
| 184 | event.Contexts["Devbox Packages"] = sentryCtx |
| 185 | } |
| 186 | |
| 187 | // Prefer using the user ID instead of the device ID when it's |
| 188 | // available. |
| 189 | if uid := userID(); uid != "" { |
| 190 | event.User.ID = uid |
| 191 | } |
| 192 | bufferSentryEvent(event) |
| 193 | |
| 194 | msgID, msg := commandEvent(meta) |
| 195 | msg.Properties["failed"] = true |
| 196 | msg.Properties["sentry_event_id"] = event.EventID |
| 197 | bufferSegmentMessage(msgID, msg) |
| 198 | } |