1package metrics
2
3import (
4 "sync/atomic"
5
6 "github.com/prometheus/client_golang/prometheus"
7 "github.com/prometheus/client_golang/prometheus/promauto"
8)
9
10var metricPanic = promauto.NewCounterVec(
11 prometheus.CounterOpts{
12 Name: "mox_panic_total",
13 Help: "Number of unhandled panics, by package.",
14 },
15 []string{
16 "pkg",
17 },
18)
19
20type Panic string
21
22const (
23 Ctl Panic = "ctl"
24 Import Panic = "import"
25 Serve Panic = "serve"
26 Imapserver Panic = "imapserver"
27 Dmarcdb Panic = "dmarcdb"
28 Mtastsdb Panic = "mtastsdb"
29 Queue Panic = "queue"
30 Smtpclient Panic = "smtpclient"
31 Smtpserver Panic = "smtpserver"
32 Tlsrptdb Panic = "tlsrptdb"
33 Dkimverify Panic = "dkimverify"
34 Spfverify Panic = "spfverify"
35 Upgradethreads Panic = "upgradethreads"
36 Importmanage Panic = "importmanage"
37 Importmessages Panic = "importmessages"
38 Store Panic = "store"
39 Webadmin Panic = "webadmin"
40 Webapi Panic = "webapi"
41 Webmailsendevent Panic = "webmailsendevent"
42 Webmail Panic = "webmail"
43 Webmailrequest Panic = "webmailrequest"
44 Webmailquery Panic = "webmailquery"
45 Webmailhandle Panic = "webmailhandle"
46)
47
48func init() {
49 // Ensure the panic counts are initialized to 0, so the query for change also picks
50 // up the first panic.
51 names := []Panic{
52 Ctl,
53 Import,
54 Serve,
55 Imapserver,
56 Mtastsdb,
57 Queue,
58 Smtpclient,
59 Smtpserver,
60 Dkimverify,
61 Spfverify,
62 Upgradethreads,
63 Importmanage,
64 Importmessages,
65 Webadmin,
66 Webmailsendevent,
67 Webmail,
68 Webmailrequest,
69 Webmailquery,
70 Webmailhandle,
71 }
72 for _, name := range names {
73 metricPanic.WithLabelValues(string(name)).Add(0)
74 }
75}
76
77var Panics atomic.Int64
78
79func PanicInc(name Panic) {
80 Panics.Add(1)
81 metricPanic.WithLabelValues(string(name)).Inc()
82}
83