浏览代码

metrics: add initial Prometheus support (#4141)

Unknwon 5 年之前
父节点
当前提交
520530dfcf
共有 7 个文件被更改,包括 69 次插入22 次删除
  1. 16 3
      cmd/web.go
  2. 6 0
      conf/app.ini
  3. 1 1
      gogs.go
  4. 0 0
      pkg/bindata/bindata.go
  5. 18 0
      pkg/context/auth.go
  6. 27 17
      pkg/setting/setting.go
  7. 1 1
      templates/.VERSION

+ 16 - 3
cmd/web.go

@@ -25,6 +25,7 @@ import (
 	"github.com/go-macaron/session"
 	"github.com/go-macaron/toolbox"
 	"github.com/mcuadros/go-version"
+	"github.com/prometheus/client_golang/prometheus/promhttp"
 	"github.com/urfave/cli"
 	log "gopkg.in/clog.v1"
 	"gopkg.in/macaron.v1"
@@ -260,11 +261,11 @@ func runWeb(c *cli.Context) error {
 	})
 	// ***** END: User *****
 
-	adminReq := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true})
+	reqAdmin := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true})
 
 	// ***** START: Admin *****
 	m.Group("/admin", func() {
-		m.Get("", adminReq, admin.Dashboard)
+		m.Get("", admin.Dashboard)
 		m.Get("/config", admin.Config)
 		m.Post("/config/test_mail", admin.SendTestMail)
 		m.Get("/monitor", admin.Monitor)
@@ -298,7 +299,7 @@ func runWeb(c *cli.Context) error {
 			m.Post("/delete", admin.DeleteNotices)
 			m.Get("/empty", admin.EmptyNotices)
 		})
-	}, adminReq)
+	}, reqAdmin)
 	// ***** END: Admin *****
 
 	m.Group("", func() {
@@ -659,6 +660,18 @@ func runWeb(c *cli.Context) error {
 		apiv1.RegisterRoutes(m)
 	}, ignSignIn)
 
+	m.Group("/-", func() {
+		if setting.Prometheus.Enabled {
+			m.Get("/metrics", func(c *context.Context) {
+				if !setting.Prometheus.EnableBasicAuth {
+					return
+				}
+
+				c.RequireBasicAuth(setting.Prometheus.BasicAuthUsername, setting.Prometheus.BasicAuthPassword)
+			}, promhttp.Handler())
+		}
+	})
+
 	// robots.txt
 	m.Get("/robots.txt", func(c *context.Context) {
 		if setting.HasRobotsTxt {

+ 6 - 0
conf/app.ini

@@ -464,6 +464,12 @@ NEWS_FEED_PAGING_NUM = 20
 ; Number of commits that are showed in one page
 COMMITS_PAGING_NUM = 30
 
+[prometheus]
+ENABLED = true
+ENABLE_BASIC_AUTH = false
+BASIC_AUTH_USERNAME =
+BASIC_AUTH_PASSWORD =
+
 [i18n]
 LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES,uk-UA,en-GB,hu-HU,sk-SK,id-ID,fa-IR,vi-VN
 NAMES = English,简体中文,繁體中文(香港),繁體中文(臺灣),Deutsch,français,Nederlands,latviešu,русский,日本語,español,português do Brasil,polski,български,italiano,suomi,Türkçe,čeština,српски,svenska,한국어,galego,українська,English (United Kingdom),Magyar,Slovenčina,Indonesian,Persian,Vietnamese

+ 1 - 1
gogs.go

@@ -16,7 +16,7 @@ import (
 	"github.com/gogs/gogs/pkg/setting"
 )
 
-const APP_VER = "0.11.65.0914"
+const APP_VER = "0.11.66.0914"
 
 func init() {
 	setting.AppVer = APP_VER

文件差异内容过多而无法显示
+ 0 - 0
pkg/bindata/bindata.go


+ 18 - 0
pkg/context/auth.go

@@ -5,13 +5,16 @@
 package context
 
 import (
+	"net/http"
 	"net/url"
+	"strings"
 
 	"github.com/go-macaron/csrf"
 	"gopkg.in/macaron.v1"
 
 	"github.com/gogs/gogs/pkg/auth"
 	"github.com/gogs/gogs/pkg/setting"
+	"github.com/gogs/gogs/pkg/tool"
 )
 
 type ToggleOptions struct {
@@ -92,3 +95,18 @@ func Toggle(options *ToggleOptions) macaron.Handler {
 		}
 	}
 }
+
+// RequireBasicAuth verifies HTTP Basic Authentication header with given credentials
+func (c *Context) RequireBasicAuth(username, password string) {
+	fields := strings.Fields(c.Req.Header.Get("Authorization"))
+	if len(fields) != 2 || fields[0] != "Basic" {
+		c.Status(http.StatusUnauthorized)
+		return
+	}
+
+	uname, passwd, _ := tool.BasicAuthDecode(fields[1])
+	if uname != username || passwd != password {
+		c.Status(http.StatusForbidden)
+		return
+	}
+}

+ 27 - 17
pkg/setting/setting.go

@@ -188,12 +188,12 @@ var (
 	}
 
 	// Picture settings
-	AvatarUploadPath      		string
-	RepositoryAvatarUploadPath	string
-	GravatarSource        		string
-	DisableGravatar       		bool
-	EnableFederatedAvatar 		bool
-	LibravatarService     		*libravatar.Libravatar
+	AvatarUploadPath           string
+	RepositoryAvatarUploadPath string
+	GravatarSource             string
+	DisableGravatar            bool
+	EnableFederatedAvatar      bool
+	LibravatarService          *libravatar.Libravatar
 
 	// Log settings
 	LogRootPath string
@@ -294,6 +294,14 @@ var (
 		} `ini:"ui.user"`
 	}
 
+	// Prometheus settings
+	Prometheus struct {
+		Enabled           bool
+		EnableBasicAuth   bool
+		BasicAuthUsername string
+		BasicAuthPassword string
+	}
+
 	// I18n settings
 	Langs     []string
 	Names     []string
@@ -652,27 +660,29 @@ func NewContext() {
 	}
 
 	if err = Cfg.Section("http").MapTo(&HTTP); err != nil {
-		log.Fatal(2, "Fail to map HTTP settings: %v", err)
+		log.Fatal(2, "Failed to map HTTP settings: %v", err)
 	} else if err = Cfg.Section("webhook").MapTo(&Webhook); err != nil {
-		log.Fatal(2, "Fail to map Webhook settings: %v", err)
+		log.Fatal(2, "Failed to map Webhook settings: %v", err)
 	} else if err = Cfg.Section("release.attachment").MapTo(&Release.Attachment); err != nil {
-		log.Fatal(2, "Fail to map Release.Attachment settings: %v", err)
+		log.Fatal(2, "Failed to map Release.Attachment settings: %v", err)
 	} else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil {
-		log.Fatal(2, "Fail to map Markdown settings: %v", err)
+		log.Fatal(2, "Failed to map Markdown settings: %v", err)
 	} else if err = Cfg.Section("smartypants").MapTo(&Smartypants); err != nil {
-		log.Fatal(2, "Fail to map Smartypants settings: %v", err)
+		log.Fatal(2, "Failed to map Smartypants settings: %v", err)
 	} else if err = Cfg.Section("admin").MapTo(&Admin); err != nil {
-		log.Fatal(2, "Fail to map Admin settings: %v", err)
+		log.Fatal(2, "Failed to map Admin settings: %v", err)
 	} else if err = Cfg.Section("cron").MapTo(&Cron); err != nil {
-		log.Fatal(2, "Fail to map Cron settings: %v", err)
+		log.Fatal(2, "Failed to map Cron settings: %v", err)
 	} else if err = Cfg.Section("git").MapTo(&Git); err != nil {
-		log.Fatal(2, "Fail to map Git settings: %v", err)
+		log.Fatal(2, "Failed to map Git settings: %v", err)
 	} else if err = Cfg.Section("mirror").MapTo(&Mirror); err != nil {
-		log.Fatal(2, "Fail to map Mirror settings: %v", err)
+		log.Fatal(2, "Failed to map Mirror settings: %v", err)
 	} else if err = Cfg.Section("api").MapTo(&API); err != nil {
-		log.Fatal(2, "Fail to map API settings: %v", err)
+		log.Fatal(2, "Failed to map API settings: %v", err)
 	} else if err = Cfg.Section("ui").MapTo(&UI); err != nil {
-		log.Fatal(2, "Fail to map UI settings: %v", err)
+		log.Fatal(2, "Failed to map UI settings: %v", err)
+	} else if err = Cfg.Section("prometheus").MapTo(&Prometheus); err != nil {
+		log.Fatal(2, "Failed to map Prometheus settings: %v", err)
 	}
 
 	if Mirror.DefaultInterval <= 0 {

+ 1 - 1
templates/.VERSION

@@ -1 +1 @@
-0.11.65.0914
+0.11.66.0914

部分文件因为文件数量过多而无法显示