mirror of
https://github.com/elyby/chrly.git
synced 2024-12-23 05:30:06 +05:30
Merge branch 'statsd' into develop
This commit is contained in:
commit
ae50e90ea7
2
data/statsd/.gitignore
vendored
Normal file
2
data/statsd/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
@ -11,3 +11,8 @@ services:
|
||||
RABBITMQ_DEFAULT_USER: "ely-skinsystem-app"
|
||||
RABBITMQ_DEFAULT_PASS: "ely-skinsystem-app-password"
|
||||
RABBITMQ_DEFAULT_VHOST: "/ely"
|
||||
|
||||
statsd:
|
||||
image: hopsoft/graphite-statsd
|
||||
volumes:
|
||||
- ./data/statsd:/opt/graphite/storage
|
||||
|
@ -11,6 +11,7 @@ services:
|
||||
links:
|
||||
- redis
|
||||
- rabbitmq
|
||||
- statsd
|
||||
|
||||
redis:
|
||||
extends:
|
||||
@ -21,3 +22,10 @@ services:
|
||||
extends:
|
||||
file: docker-compose.base.yml
|
||||
service: rabbitmq
|
||||
|
||||
statsd:
|
||||
extends:
|
||||
file: docker-compose.base.yml
|
||||
service: statsd
|
||||
ports:
|
||||
- "8123:80"
|
||||
|
@ -62,13 +62,16 @@ func (s *SkinItem) Delete() {
|
||||
|
||||
func FindSkinByUsername(username string) (SkinItem, error) {
|
||||
var record SkinItem;
|
||||
services.Logger.IncCounter("storage.query", 1)
|
||||
response := services.RedisPool.Cmd("GET", tools.BuildKey(username));
|
||||
if (response.IsType(redis.Nil)) {
|
||||
services.Logger.IncCounter("storage.not_found", 1)
|
||||
return record, SkinNotFound{username}
|
||||
}
|
||||
|
||||
result, err := response.Str()
|
||||
if (err == nil) {
|
||||
services.Logger.IncCounter("storage.found", 1)
|
||||
decodeErr := json.Unmarshal([]byte(result), &record)
|
||||
if (decodeErr != nil) {
|
||||
log.Println("Cannot decode record data")
|
||||
|
@ -2,18 +2,21 @@ package routes
|
||||
|
||||
import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
"elyby/minecraft-skinsystem/lib/tools"
|
||||
"elyby/minecraft-skinsystem/lib/data"
|
||||
"elyby/minecraft-skinsystem/lib/services"
|
||||
)
|
||||
|
||||
func Cape(response http.ResponseWriter, request *http.Request) {
|
||||
if (mux.Vars(request)["converted"] == "") {
|
||||
services.Logger.IncCounter("capes.request", 1)
|
||||
}
|
||||
|
||||
username := tools.ParseUsername(mux.Vars(request)["username"])
|
||||
log.Println("request cape for username " + username)
|
||||
rec, err := data.FindCapeByUsername(username)
|
||||
if (err != nil) {
|
||||
http.Redirect(response, request, "http://skins.minecraft.net/MinecraftCloaks/" + username + ".png", 301)
|
||||
@ -24,6 +27,7 @@ func Cape(response http.ResponseWriter, request *http.Request) {
|
||||
}
|
||||
|
||||
func CapeGET(w http.ResponseWriter, r *http.Request) {
|
||||
services.Logger.IncCounter("capes.get_request", 1)
|
||||
username := r.URL.Query().Get("name")
|
||||
if username == "" {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
@ -31,5 +35,6 @@ func CapeGET(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
mux.Vars(r)["username"] = username
|
||||
mux.Vars(r)["converted"] = "1"
|
||||
Cape(w, r)
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
@ -14,7 +13,6 @@ const defaultHash = "default"
|
||||
|
||||
func Face(w http.ResponseWriter, r *http.Request) {
|
||||
username := tools.ParseUsername(mux.Vars(r)["username"])
|
||||
log.Println("request skin for username " + username);
|
||||
rec, err := data.FindSkinByUsername(username)
|
||||
var hash string
|
||||
if (err != nil || rec.SkinId == 0) {
|
||||
|
@ -4,6 +4,8 @@ import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
"elyby/minecraft-skinsystem/lib/services"
|
||||
)
|
||||
|
||||
// Метод-наследие от первой версии системы скинов.
|
||||
@ -18,11 +20,15 @@ func MinecraftPHP(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
mux.Vars(r)["username"] = username
|
||||
mux.Vars(r)["converted"] = "1"
|
||||
switch required {
|
||||
case "skin": Skin(w, r)
|
||||
case "cloack": Cape(w, r)
|
||||
default: {
|
||||
case "skin":
|
||||
services.Logger.IncCounter("skins.minecraft-php-request", 1)
|
||||
Skin(w, r)
|
||||
case "cloack":
|
||||
services.Logger.IncCounter("capes.minecraft-php-request", 1)
|
||||
Cape(w, r)
|
||||
default:
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,18 +1,21 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
"elyby/minecraft-skinsystem/lib/tools"
|
||||
"elyby/minecraft-skinsystem/lib/data"
|
||||
"elyby/minecraft-skinsystem/lib/services"
|
||||
)
|
||||
|
||||
func Skin(w http.ResponseWriter, r *http.Request) {
|
||||
if (mux.Vars(r)["converted"] == "") {
|
||||
services.Logger.IncCounter("skins.request", 1)
|
||||
}
|
||||
|
||||
username := tools.ParseUsername(mux.Vars(r)["username"])
|
||||
log.Println("request skin for username " + username);
|
||||
rec, err := data.FindSkinByUsername(username)
|
||||
if (err != nil) {
|
||||
http.Redirect(w, r, "http://skins.minecraft.net/MinecraftSkins/" + username + ".png", 301)
|
||||
@ -23,6 +26,7 @@ func Skin(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func SkinGET(w http.ResponseWriter, r *http.Request) {
|
||||
services.Logger.IncCounter("skins.get_request", 1)
|
||||
username := r.URL.Query().Get("name")
|
||||
if username == "" {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
@ -30,5 +34,6 @@ func SkinGET(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
mux.Vars(r)["username"] = username
|
||||
mux.Vars(r)["converted"] = "1"
|
||||
Skin(w, r)
|
||||
}
|
||||
|
@ -13,8 +13,8 @@ import (
|
||||
)
|
||||
|
||||
func Textures(w http.ResponseWriter, r *http.Request) {
|
||||
services.Logger.IncCounter("textures.request", 1)
|
||||
username := tools.ParseUsername(mux.Vars(r)["username"])
|
||||
log.Println("request textures for username " + username)
|
||||
|
||||
rec, err := data.FindSkinByUsername(username)
|
||||
if (err != nil || rec.SkinId == 0) {
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"github.com/mediocregopher/radix.v2/pool"
|
||||
"github.com/streadway/amqp"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/mono83/slf/wd"
|
||||
)
|
||||
|
||||
var Router *mux.Router
|
||||
@ -13,3 +14,5 @@ var RedisPool *pool.Pool
|
||||
var RabbitMQChannel *amqp.Channel
|
||||
|
||||
var RootFolder string
|
||||
|
||||
var Logger wd.Watchdog
|
||||
|
@ -2,11 +2,12 @@ package worker
|
||||
|
||||
import (
|
||||
"elyby/minecraft-skinsystem/lib/data"
|
||||
"log"
|
||||
"elyby/minecraft-skinsystem/lib/services"
|
||||
)
|
||||
|
||||
func handleChangeUsername(model usernameChanged) (bool) {
|
||||
if (model.OldUsername == "") {
|
||||
services.Logger.IncCounter("worker.change_username.empty_old_username", 1)
|
||||
record := data.SkinItem{
|
||||
UserId: model.AccountId,
|
||||
Username: model.NewUsername,
|
||||
@ -19,7 +20,7 @@ func handleChangeUsername(model usernameChanged) (bool) {
|
||||
|
||||
record, err := data.FindSkinByUsername(model.OldUsername)
|
||||
if (err != nil) {
|
||||
log.Println("Exit by not found record")
|
||||
services.Logger.IncCounter("worker.change_username.username_not_found", 1)
|
||||
// TODO: я не уверен, что это валидное поведение
|
||||
// Суть в том, что здесь может возникнуть ошибка в том случае, если записи в базе нету
|
||||
// а значит его нужно, как минимум, зарегистрировать
|
||||
@ -29,7 +30,7 @@ func handleChangeUsername(model usernameChanged) (bool) {
|
||||
record.Username = model.NewUsername
|
||||
record.Save()
|
||||
|
||||
log.Println("all saved!")
|
||||
services.Logger.IncCounter("worker.change_username.processed", 1)
|
||||
|
||||
return true
|
||||
}
|
||||
@ -37,6 +38,7 @@ func handleChangeUsername(model usernameChanged) (bool) {
|
||||
func handleSkinChanged(model skinChanged) (bool) {
|
||||
record, err := data.FindSkinById(model.AccountId)
|
||||
if (err != nil) {
|
||||
services.Logger.IncCounter("worker.skin_changed.id_not_found", 1)
|
||||
return true
|
||||
}
|
||||
|
||||
@ -48,5 +50,7 @@ func handleSkinChanged(model skinChanged) (bool) {
|
||||
|
||||
record.Save()
|
||||
|
||||
services.Logger.IncCounter("worker.skin_changed.processed", 1)
|
||||
|
||||
return true
|
||||
}
|
||||
|
@ -11,6 +11,10 @@ import (
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/streadway/amqp"
|
||||
"github.com/mediocregopher/radix.v2/pool"
|
||||
"github.com/mono83/slf/wd"
|
||||
"github.com/mono83/slf/rays"
|
||||
"github.com/mono83/slf/recievers/ansi"
|
||||
"github.com/mono83/slf/recievers/statsd"
|
||||
|
||||
"elyby/minecraft-skinsystem/lib/routes"
|
||||
"elyby/minecraft-skinsystem/lib/services"
|
||||
@ -56,6 +60,27 @@ func main() {
|
||||
}
|
||||
log.Println("Connected to rabbitmq channel")
|
||||
|
||||
// statsd
|
||||
var statsdString = os.Getenv("STATSD_ADDR")
|
||||
if (statsdString != "") {
|
||||
log.Println("Connecting to statsd")
|
||||
hostname, _ := os.Hostname()
|
||||
statsdReceiver, err := statsd.NewReceiver(statsd.Config{
|
||||
Address: statsdString,
|
||||
Prefix: "ely.skinsystem." + hostname + ".app.",
|
||||
FlushEvery: 1,
|
||||
})
|
||||
if (err != nil) {
|
||||
log.Fatal("statsd connection error")
|
||||
}
|
||||
|
||||
wd.AddReceiver(statsdReceiver)
|
||||
} else {
|
||||
wd.AddReceiver(ansi.New(true, true, false))
|
||||
}
|
||||
|
||||
logger := wd.New("", "").WithParams(rays.Host)
|
||||
|
||||
router := mux.NewRouter().StrictSlash(true)
|
||||
router.HandleFunc("/skins/{username}", routes.Skin).Methods("GET").Name("skins")
|
||||
router.HandleFunc("/cloaks/{username}", routes.Cape).Methods("GET").Name("cloaks")
|
||||
@ -72,6 +97,7 @@ func main() {
|
||||
services.Router = router
|
||||
services.RedisPool = redisPool
|
||||
services.RabbitMQChannel = rabbitChannel
|
||||
services.Logger = logger
|
||||
|
||||
_, file, _, _ := runtime.Caller(0)
|
||||
services.RootFolder = filepath.Dir(file)
|
||||
|
Loading…
Reference in New Issue
Block a user