diff --git a/handlers/badges.go b/handlers/badges.go index ffb974c..e5ec635 100644 --- a/handlers/badges.go +++ b/handlers/badges.go @@ -39,9 +39,9 @@ var ( ) const ( - ColorSchemeGreen = "fill-opacity:1.00; fill:rgb(49, 197, 83);" - ColorSchemeOrange = "fill-opacity:1.00; fill:rgb(255, 87, 34);" - ColorSchemeBlue = "fill-opacity:1.00; fill:rgb(32, 99, 155);" + ColorSchemeGreen = ColorScheme("fill-opacity:1.00; fill:rgb(49, 197, 83);") + ColorSchemeOrange = ColorScheme("fill-opacity:1.00; fill:rgb(255, 87, 34);") + ColorSchemeBlue = ColorScheme("fill-opacity:1.00; fill:rgb(32, 99, 155);") BadgeTypePrometheus = "PROMETHEUS" pageViewsLabel = "Page Views" radius = 0 @@ -67,8 +67,10 @@ type BadgesHandler struct { PrometheusAPIClient api.Client } +type ColorScheme string + func (handler *BadgesHandler) GetBadge(c *gin.Context) { - if err := handler.generateSVG(c); err != nil { + if err := handler.generateSVG(c, ColorSchemeGreen); err != nil { logrus.Error(err) if err == ErrNoSuchBadgeFound { c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) @@ -79,7 +81,32 @@ func (handler *BadgesHandler) GetBadge(c *gin.Context) { } } -func (handler *BadgesHandler) generateSVG(c *gin.Context) error { +func (handler *BadgesHandler) GetBadgeWithColorScheme(c *gin.Context) { + color := c.Param("color") + var colorScheme ColorScheme + switch color { + case "green.svg": + colorScheme = ColorSchemeGreen + case "orange.svg": + colorScheme = ColorSchemeOrange + case "blue.svg": + colorScheme = ColorSchemeBlue + default: + colorScheme = ColorSchemeGreen + } + + if err := handler.generateSVG(c, colorScheme); err != nil { + logrus.Error(err) + if err == ErrNoSuchBadgeFound { + c.JSON(http.StatusNotFound, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusInternalServerError, gin.H{"error": ErrorMessageInternalError}) + } +} + +func (handler *BadgesHandler) generateSVG(c *gin.Context, colorScheme ColorScheme) error { startTime := time.Now() queryName := c.Param("name") @@ -122,7 +149,7 @@ func (handler *BadgesHandler) generateSVG(c *gin.Context) error { //labelContainerWidth := len(metric.Label)*fontSize + textMarginX - canvas.Rect(0, 0, int(labelContainerWidth), badgeHeight, string(ColorSchemeGreen)) + canvas.Rect(0, 0, int(labelContainerWidth), badgeHeight, string(colorScheme)) //when there is metric label then use default label if len(prometheusOptions.ValueField) == 0 { diff --git a/main.go b/main.go index 9063ff8..40fe856 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - "encoding/json" "fmt" "log" "net/http" @@ -9,7 +8,6 @@ import ( "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" - "github.com/jinzhu/gorm/dialects/postgres" _ "github.com/jinzhu/gorm/dialects/postgres" "github.com/prometheus/client_golang/api" "github.com/wahyd4/badger/handlers" @@ -22,20 +20,6 @@ import ( type ColorScheme string -var ( - queriesMap = map[string]queryParam{ - "mel": {Color: handlers.ColorSchemeGreen, Query: "air_index_iaqi_pm25_v{city_name=\"Melbourne CBD\"}", ValueField: "city_name"}, - "chengdu": {Color: handlers.ColorSchemeGreen, Query: "air_index_iaqi_pm25_v{city_name=\"Chengdu (成都)\"}", ValueField: "city_name"}, - "dockerhub": {Color: handlers.ColorSchemeGreen, Query: "docker_hub_pull_count{name=\"aria2-ui\"}", ValueField: "name"}, - "github": {Color: handlers.ColorSchemeGreen, Query: "github_repository_stars{name=\"aria2-ariang-docker\"}", ValueField: "name"}, - "badge-requests-count": {Color: handlers.ColorSchemeBlue, Query: "ceil(sum(increase(badge_requested_total[500d])))", Label: "Badge Req Count"}, - "junv-github-profile": {Color: handlers.ColorSchemeBlue, Query: "ceil(sum(increase(badge_requested_total{badge=\"junv-github-profile\"}[500d])))", Label: "Page Views"}, - "aria2-ariang-docker": {Color: handlers.ColorSchemeBlue, Query: "ceil(sum(increase(badge_requested_total{badge=\"aria2-ariang-docker\"}[500d])))", Label: "Page Views"}, - "aria2-ariang-x-docker-compose": {Color: handlers.ColorSchemeBlue, Query: "ceil(sum(increase(badge_requested_total{badge=\"aria2-ariang-x-docker-compose\"}[500d])))", Label: "Page Views"}, - "work-in-australia": {Color: handlers.ColorSchemeBlue, Query: "ceil(sum(increase(badge_requested_total{badge=\"work-in-australia\"}[500d])))", Label: "Page Views"}, - "aria-ui-dockerhub": {Color: handlers.ColorSchemeBlue, Query: "ceil(sum(increase(badge_requested_total{badge=\"aria-ui-dockerhub\"}[500d])))", Label: "Page Views"}, - } -) type queryParam struct { Color ColorScheme @@ -89,6 +73,8 @@ func main() { r.GET("/svg/:name", handler.GetBadge) + r.GET("/badges/:name/:color", handler.GetBadgeWithColorScheme) + r.StaticFile("/favicon.ico", "static/favicon.ico") r.StaticFile("/robots.txt", "static/robots.txt") @@ -102,7 +88,6 @@ func main() { logrus.Error(err) os.Exit(1) } - }() log.Fatal(r.Run()) @@ -114,27 +99,4 @@ func getEnvWithDefault(key, defaultValue string) string { return val } return defaultValue -} - -func importMaps(db *gorm.DB) { - for key, value := range queriesMap { - jsonB := new(postgres.Jsonb) - options := models.PrometheusOptions{ - ValueField: value.ValueField, - Query: value.Query, - } - bytes, err := json.Marshal(&options) - if err != nil { - logrus.Errorf("failed to marshal option to bytes %w", err) - } - if err = jsonB.Scan(bytes); err != nil { - logrus.Error(err.Error()) - } - db.Save(&models.Badge{ - Label: value.Label, - ULID: key, - Type: handlers.BadgeTypePrometheus, - Options: jsonB, - }) - } -} +} \ No newline at end of file