forked from MirrorHub/mautrix-whatsapp
Add some simple metrics for retry receipts
This commit is contained in:
parent
125ccd3dbb
commit
7e6c645f19
2
go.mod
2
go.mod
|
@ -9,7 +9,7 @@ require (
|
||||||
github.com/mattn/go-sqlite3 v1.14.10
|
github.com/mattn/go-sqlite3 v1.14.10
|
||||||
github.com/prometheus/client_golang v1.11.0
|
github.com/prometheus/client_golang v1.11.0
|
||||||
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
|
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
|
||||||
go.mau.fi/whatsmeow v0.0.0-20220124150706-afc33ee3c21a
|
go.mau.fi/whatsmeow v0.0.0-20220128124639-e64fb976bf15
|
||||||
golang.org/x/image v0.0.0-20211028202545-6944b10bf410
|
golang.org/x/image v0.0.0-20211028202545-6944b10bf410
|
||||||
google.golang.org/protobuf v1.27.1
|
google.golang.org/protobuf v1.27.1
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -140,8 +140,8 @@ github.com/tidwall/sjson v1.2.4 h1:cuiLzLnaMeBhRmEv00Lpk3tkYrcxpmbU81tAY4Dw0tc=
|
||||||
github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=
|
github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=
|
||||||
go.mau.fi/libsignal v0.0.0-20211109153248-a67163214910 h1:9FFhG0OmkuMau5UEaTgiUQ+7cSbtbOQ7hiWKdN8OI3I=
|
go.mau.fi/libsignal v0.0.0-20211109153248-a67163214910 h1:9FFhG0OmkuMau5UEaTgiUQ+7cSbtbOQ7hiWKdN8OI3I=
|
||||||
go.mau.fi/libsignal v0.0.0-20211109153248-a67163214910/go.mod h1:AufGrvVh+00Nc07Jm4hTquh7yleZyn20tKJI2wCPAKg=
|
go.mau.fi/libsignal v0.0.0-20211109153248-a67163214910/go.mod h1:AufGrvVh+00Nc07Jm4hTquh7yleZyn20tKJI2wCPAKg=
|
||||||
go.mau.fi/whatsmeow v0.0.0-20220124150706-afc33ee3c21a h1:e8aExGixi/O+kveh6S3wgydk9ogU5+gx0NqOmqWMapM=
|
go.mau.fi/whatsmeow v0.0.0-20220128124639-e64fb976bf15 h1:BmdZu7K6IHsb+sPxvzkEjAINKxTMNeSiJRe1cvfesIY=
|
||||||
go.mau.fi/whatsmeow v0.0.0-20220124150706-afc33ee3c21a/go.mod h1:8jUjOAi3xtGubxcZgG8uSHpAdyQXBRbWAfxkctX/4y4=
|
go.mau.fi/whatsmeow v0.0.0-20220128124639-e64fb976bf15/go.mod h1:8jUjOAi3xtGubxcZgG8uSHpAdyQXBRbWAfxkctX/4y4=
|
||||||
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
|
16
metrics.go
16
metrics.go
|
@ -20,6 +20,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"net/http"
|
"net/http"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -50,6 +51,7 @@ type MetricsHandler struct {
|
||||||
whatsappMessageHandling *prometheus.HistogramVec
|
whatsappMessageHandling *prometheus.HistogramVec
|
||||||
countCollection prometheus.Histogram
|
countCollection prometheus.Histogram
|
||||||
disconnections *prometheus.CounterVec
|
disconnections *prometheus.CounterVec
|
||||||
|
incomingRetryReceipts *prometheus.CounterVec
|
||||||
puppetCount prometheus.Gauge
|
puppetCount prometheus.Gauge
|
||||||
userCount prometheus.Gauge
|
userCount prometheus.Gauge
|
||||||
messageCount prometheus.Gauge
|
messageCount prometheus.Gauge
|
||||||
|
@ -99,6 +101,10 @@ func NewMetricsHandler(address string, log log.Logger, db *database.Database) *M
|
||||||
Name: "whatsapp_disconnections",
|
Name: "whatsapp_disconnections",
|
||||||
Help: "Number of times a Matrix user has been disconnected from WhatsApp",
|
Help: "Number of times a Matrix user has been disconnected from WhatsApp",
|
||||||
}, []string{"user_id"}),
|
}, []string{"user_id"}),
|
||||||
|
incomingRetryReceipts: promauto.NewCounterVec(prometheus.CounterOpts{
|
||||||
|
Name: "whatsapp_incoming_retry_receipts",
|
||||||
|
Help: "Number of times a remote WhatsApp user has requested a retry from the bridge. retry_count = 5 is usually the last attempt (and very likely means a failed message)",
|
||||||
|
}, []string{"retry_count", "message_found"}),
|
||||||
puppetCount: promauto.NewGauge(prometheus.GaugeOpts{
|
puppetCount: promauto.NewGauge(prometheus.GaugeOpts{
|
||||||
Name: "whatsapp_puppets_total",
|
Name: "whatsapp_puppets_total",
|
||||||
Help: "Number of WhatsApp users bridged into Matrix",
|
Help: "Number of WhatsApp users bridged into Matrix",
|
||||||
|
@ -167,6 +173,16 @@ func (mh *MetricsHandler) TrackDisconnection(userID id.UserID) {
|
||||||
mh.disconnections.With(prometheus.Labels{"user_id": string(userID)}).Inc()
|
mh.disconnections.With(prometheus.Labels{"user_id": string(userID)}).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (mh *MetricsHandler) TrackRetryReceipt(count int, found bool) {
|
||||||
|
if !mh.running {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mh.incomingRetryReceipts.With(prometheus.Labels{
|
||||||
|
"retry_count": strconv.Itoa(count),
|
||||||
|
"message_found": strconv.FormatBool(found),
|
||||||
|
}).Inc()
|
||||||
|
}
|
||||||
|
|
||||||
func (mh *MetricsHandler) TrackLoginState(jid types.JID, loggedIn bool) {
|
func (mh *MetricsHandler) TrackLoginState(jid types.JID, loggedIn bool) {
|
||||||
if !mh.running {
|
if !mh.running {
|
||||||
return
|
return
|
||||||
|
|
20
user.go
20
user.go
|
@ -39,6 +39,7 @@ import (
|
||||||
|
|
||||||
"go.mau.fi/whatsmeow"
|
"go.mau.fi/whatsmeow"
|
||||||
"go.mau.fi/whatsmeow/appstate"
|
"go.mau.fi/whatsmeow/appstate"
|
||||||
|
waProto "go.mau.fi/whatsmeow/binary/proto"
|
||||||
"go.mau.fi/whatsmeow/store"
|
"go.mau.fi/whatsmeow/store"
|
||||||
"go.mau.fi/whatsmeow/types"
|
"go.mau.fi/whatsmeow/types"
|
||||||
"go.mau.fi/whatsmeow/types/events"
|
"go.mau.fi/whatsmeow/types/events"
|
||||||
|
@ -318,6 +319,19 @@ func (w *waLogger) Sub(module string) waLog.Logger { return &waLogger{l:
|
||||||
|
|
||||||
var ErrAlreadyLoggedIn = errors.New("already logged in")
|
var ErrAlreadyLoggedIn = errors.New("already logged in")
|
||||||
|
|
||||||
|
func (user *User) createClient(sess *store.Device) {
|
||||||
|
user.Client = whatsmeow.NewClient(sess, &waLogger{user.log.Sub("Client")})
|
||||||
|
user.Client.AddEventHandler(user.HandleEvent)
|
||||||
|
user.Client.GetMessageForRetry = func(to types.JID, id types.MessageID) *waProto.Message {
|
||||||
|
user.bridge.Metrics.TrackRetryReceipt(0, false)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
user.Client.PreRetryCallback = func(receipt *events.Receipt, retryCount int, msg *waProto.Message) bool {
|
||||||
|
user.bridge.Metrics.TrackRetryReceipt(retryCount, true)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (user *User) Login(ctx context.Context) (<-chan whatsmeow.QRChannelItem, error) {
|
func (user *User) Login(ctx context.Context) (<-chan whatsmeow.QRChannelItem, error) {
|
||||||
user.connLock.Lock()
|
user.connLock.Lock()
|
||||||
defer user.connLock.Unlock()
|
defer user.connLock.Unlock()
|
||||||
|
@ -328,8 +342,7 @@ func (user *User) Login(ctx context.Context) (<-chan whatsmeow.QRChannelItem, er
|
||||||
}
|
}
|
||||||
newSession := user.bridge.WAContainer.NewDevice()
|
newSession := user.bridge.WAContainer.NewDevice()
|
||||||
newSession.Log = &waLogger{user.log.Sub("Session")}
|
newSession.Log = &waLogger{user.log.Sub("Session")}
|
||||||
user.Client = whatsmeow.NewClient(newSession, &waLogger{user.log.Sub("Client")})
|
user.createClient(newSession)
|
||||||
user.Client.AddEventHandler(user.HandleEvent)
|
|
||||||
qrChan, err := user.Client.GetQRChannel(ctx)
|
qrChan, err := user.Client.GetQRChannel(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to get QR channel: %w", err)
|
return nil, fmt.Errorf("failed to get QR channel: %w", err)
|
||||||
|
@ -351,8 +364,7 @@ func (user *User) Connect() bool {
|
||||||
}
|
}
|
||||||
user.log.Debugln("Connecting to WhatsApp")
|
user.log.Debugln("Connecting to WhatsApp")
|
||||||
user.sendBridgeState(BridgeState{StateEvent: StateConnecting, Error: WAConnecting})
|
user.sendBridgeState(BridgeState{StateEvent: StateConnecting, Error: WAConnecting})
|
||||||
user.Client = whatsmeow.NewClient(user.Session, &waLogger{user.log.Sub("Client")})
|
user.createClient(user.Session)
|
||||||
user.Client.AddEventHandler(user.HandleEvent)
|
|
||||||
err := user.Client.Connect()
|
err := user.Client.Connect()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
user.log.Warnln("Error connecting to WhatsApp:", err)
|
user.log.Warnln("Error connecting to WhatsApp:", err)
|
||||||
|
|
Loading…
Reference in a new issue