From cf3d15fa77d6d7ad66402405a6684dfe28bcdbf3 Mon Sep 17 00:00:00 2001
From: usbharu <i@usbharu.dev>
Date: Wed, 16 Apr 2025 14:00:17 +0900
Subject: [PATCH] =?UTF-8?q?=E3=82=AA=E3=83=B3=E3=83=A9=E3=82=A4=E3=83=B3?=
 =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=82=92=E8=A6=8B=E3=82=8C?=
 =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 collector.go | 37 +++++++++++++++++++++++++++++++++++--
 main.go      | 11 ++++++++++-
 2 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/collector.go b/collector.go
index aee6b5a..130f92b 100644
--- a/collector.go
+++ b/collector.go
@@ -2,8 +2,10 @@ package main
 
 import (
 	"bytes"
+	"encoding/json"
 	"github.com/sirupsen/logrus"
 	"github.com/yitsushi/go-misskey/services/notes/timeline"
+	"io"
 	"net/http"
 	"time"
 )
@@ -78,6 +80,39 @@ func collectStats() {
 	}
 }
 
+type OnlineUsers struct {
+	Count int `json:"count"`
+}
+
+func collectOnlineUsers() {
+	for {
+		time.Sleep(1 * time.Minute)
+		response, err := http.Get("https://" + endpoint + "/api/get-online-users-count")
+		if err != nil {
+			logrus.Warning(err)
+			continue
+		}
+		if err != nil {
+			logrus.Warning(err)
+			continue
+		}
+		var onlineUsers OnlineUsers
+
+		all, err := io.ReadAll(response.Body)
+		err = response.Body.Close()
+		if err != nil {
+			logrus.Warning(err)
+			continue
+		}
+
+		err = json.Unmarshal(all, &onlineUsers)
+		if err != nil {
+			logrus.Warning(err)
+		}
+		misskeyOnlineUsers.Set(float64(onlineUsers.Count))
+	}
+}
+
 func collectTimeline() {
 	for {
 		time.Sleep(30 * time.Second)
@@ -92,7 +127,6 @@ func collectTimeline() {
 			misskeyGlobalTimelineResponseTimeRaw.Set(float64(time.Since(start).Milliseconds()) / 1000)
 			if len(global) != 0 {
 				misskeyGlobalTimelineLastNotePublished.Set(float64(global[0].CreatedAt.UnixMilli()))
-
 			}
 		}()
 		go func() {
@@ -106,7 +140,6 @@ func collectTimeline() {
 			misskeyLocalTimelineResponseTimeRaw.Set(float64(time.Since(start).Milliseconds()) / 1000)
 			if len(global) != 0 {
 				misskeyLocalTimelineLastNotePublished.Set(float64(global[0].CreatedAt.UnixMilli()))
-
 			}
 		}()
 
diff --git a/main.go b/main.go
index 17241d2..fb8f5fb 100644
--- a/main.go
+++ b/main.go
@@ -100,20 +100,27 @@ var (
 			Name: "misskey_local_timeline_response_time_raw",
 			Help: "Response Time for misskey Local Timeline",
 		})
+	misskeyOnlineUsers = prometheus.NewGauge(
+		prometheus.GaugeOpts{
+			Name: "misskey_online_users",
+			Help: "Online Users",
+		})
 )
 
 func main() {
 	options, err := misskey.NewClientWithOptions(
 		misskey.WithAPIToken(apiKey),
 		misskey.WithBaseURL("https", endpoint, ""),
-		misskey.WithLogLevel(logrus.DebugLevel),
+		misskey.WithLogLevel(logrus.InfoLevel),
 	)
 	client = options
 	if err != nil {
+		logrus.Error(err)
 		return
 	}
 	stats, err := client.Admin().Queue().Stats()
 	if err != nil {
+		logrus.Error(err)
 		return
 	}
 	fmt.Println(stats)
@@ -132,6 +139,7 @@ func main() {
 	prometheus.MustRegister(misskeyLocalTimelineLastNotePublished)
 	prometheus.MustRegister(misskeyGlobalTimelineResponseTimeRaw)
 	prometheus.MustRegister(misskeyLocalTimelineResponseTimeRaw)
+	prometheus.MustRegister(misskeyOnlineUsers)
 
 	handler := promhttp.Handler()
 
@@ -145,6 +153,7 @@ func main() {
 		go collectPing()
 		go collectStats()
 		go collectTimeline()
+		go collectOnlineUsers()
 	}()
 
 	logrus.Error(server.ListenAndServe())