package main import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" "github.com/yitsushi/go-misskey" "net" "net/http" "os" "strings" "time" ) //TIP

To run your code, right-click the code and select Run.

Alternatively, click // the icon in the gutter and select the Run menu item from here.

//var now = time.Now() var client *misskey.Client var endpoint = os.Getenv("MISSKEY_ENDPOINT") var protocol, hasProtocolEnv = os.LookupEnv("MISSKEY_PROTOCOL") var path = os.Getenv("MISSKEY_PATH") var apiKey = os.Getenv("MISSKEY_API_TOKEN") var logLevelEnv = os.Getenv("LOGGER_LEVEL") var logFormatEnv = os.Getenv("LOGGER_FORMAT") var httpClient = &http.Client{ Timeout: 5 * time.Second, Transport: &http.Transport{ DialContext: (&net.Dialer{ Timeout: time.Second, }).DialContext, TLSHandshakeTimeout: time.Second, ResponseHeaderTimeout: time.Second, IdleConnTimeout: time.Second, }, } var ( misskeyJobQueueJobsCount = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "misskey_jobqueue_jobs", Help: "misskey job queue jobs", }, []string{"type", "status"}, ) misskeyJobQueueDelayed = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "misskey_jobqueue_delayed", Help: "Delayed Job", }, []string{"type", "host"}) misskeyNotesCount = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_notes_count", Help: "Notes Coount", }, ) misskeyUsersCount = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_users_count", Help: "Users Coount", }, ) misskeyOriginalNotesCount = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_original_notes_count", Help: "Original Notes Coount", }, ) misskeyOriginalUsersCount = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_original_users_count", Help: "Original Users Coount", }, ) misskeyPingResponseCode = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_ping_response_code", Help: "Response Code for misskey Ping", }, ) misskeyGlobalTimelineLastNotePublished = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_global_timeline_last_note_published", Help: "Last Note Published on Global Timeline", }) misskeyLocalTimelineLastNotePublished = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_local_timeline_last_note_published", Help: "Last Note Published on Local Timeline", }) misskeyHomeTimelineLastNotePublished = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_home_timeline_last_note_published", Help: "Last Note Published on Home Timeline", }, ) misskeySocialTimelineLastNotePublished = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_social_timeline_last_note_published", Help: "Last Note Published on Home Timeline", }, ) misskeyApiResponseTime = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "misskey_api_response_time", Help: "Response Time for misskey API", Buckets: prometheus.DefBuckets, }, []string{"type", "api"}, ) misskeyApiResponseTimeRaw = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "misskey_api_response_time_raw", Help: "Response Time for misskey API", }, []string{"type", "api"}, ) misskeyOnlineUsers = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "misskey_online_users", Help: "Online Users", }) misskeyMeta = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "misskey_meta", Help: "Misskey Instance Metadata", }, []string{"version"}) ) func main() { if !hasProtocolEnv { protocol = "https" } options, err := misskey.NewClientWithOptions( misskey.WithAPIToken(apiKey), misskey.WithBaseURL(protocol, endpoint, path), ) var logLevel logrus.Level switch { case strings.EqualFold("DEBUG", logLevelEnv): logLevel = logrus.DebugLevel break case strings.EqualFold("INFO", logLevelEnv): logLevel = logrus.InfoLevel break case strings.EqualFold("WARN", logLevelEnv): logLevel = logrus.WarnLevel break case strings.EqualFold("ERROR", logLevelEnv): logLevel = logrus.ErrorLevel break case strings.EqualFold("FATAL", logLevelEnv): logLevel = logrus.FatalLevel break case strings.EqualFold("TRACE", logLevelEnv): logLevel = logrus.TraceLevel break default: logLevel = logrus.InfoLevel } if strings.EqualFold("json", logFormatEnv) { logrus.SetFormatter(&logrus.JSONFormatter{}) } logrus.SetLevel(logLevel) client = options if err != nil { logrus.Error(err) return } prometheus.MustRegister(misskeyJobQueueJobsCount) prometheus.MustRegister(misskeyJobQueueDelayed) prometheus.MustRegister(misskeyNotesCount) prometheus.MustRegister(misskeyUsersCount) prometheus.MustRegister(misskeyOriginalNotesCount) prometheus.MustRegister(misskeyOriginalUsersCount) prometheus.MustRegister(misskeyPingResponseCode) prometheus.MustRegister(misskeyGlobalTimelineLastNotePublished) prometheus.MustRegister(misskeyLocalTimelineLastNotePublished) prometheus.MustRegister(misskeyHomeTimelineLastNotePublished) prometheus.MustRegister(misskeySocialTimelineLastNotePublished) prometheus.MustRegister(misskeyApiResponseTime) prometheus.MustRegister(misskeyApiResponseTimeRaw) prometheus.MustRegister(misskeyOnlineUsers) prometheus.MustRegister(misskeyMeta) handler := promhttp.Handler() server := http.Server{ Addr: ":8080", Handler: handler, } go func() { go collectJobqueue() go collectDelayed() go collectPing() go collectStats() go collectTimeline() go collectOnlineUsers() go collectMeta() }() logrus.Error(server.ListenAndServe()) }