GO Actuator
GO actuator configures the set of actuator endpoints for your application. It is compatible with Fast HTTP, GIN and NET/HTTP.
Installation
go get github.com/sinhashubham95/go-actuator
How to Use
The actuator library is compatible with the most famous web frameworks. This is highly configurable and each endpoint can be enabled or disabled during initialization. You can also specify a prefix path for each of these configured endpoints(with default value /actuator
).
Configuration
The configuration contains the following:-
-
Endpoints - This is the list of endpoints which will be enabled. This is not a mandatory parameter. If not provided, then all the endpoints will be enabled. The possible endpoints are - /env
, /httpTrace
, /info
, /metrics
, /ping
, /shutdown
and /threadDump
. You can find the description of each of these endpoints below.
-
Prefix - This is the prefix request path for all the configured endpoints.
import "github.com/sinhashubham95/go-actuator/models"
config := &models.Config{
Endpoints: []int{
models.Env, models.HTTPTrace, models.Info, models.Metrics, models.Ping, models.Shutdown, models.ThreadDump
},
Prefix: "/actuator"
}
import (
"github.com/valyala/fasthttp"
actuator "github.com/sinhashubham95/go-actuator"
"github.com/sinhashubham95/go-actuator/models"
)
actuatorHandler := actuator.GetFastHTTPActuatorHandler(&models.Config{})
handler := func(ctx *fasthttp.RequestCtx) {
switch(ctx.Path()) {
// your configured paths
default:
actuatorHandler(ctx)
}
}
fasthttp.ListenAndServe(":8080", handler)
Using with GIN
import (
"github.com/gin-gonic/gin"
actuator "github.com/sinhashubham95/go-actuator"
"github.com/sinhashubham95/go-actuator/models"
)
engine := gin.Default()
actuator.ConfigureGINActuatorEngine(&models.Config{}, engine)
import (
actuator "github.com/sinhashubham95/go-actuator"
"github.com/sinhashubham95/go-actuator/models"
"net/http"
)
mux := &http.ServeMux{}
actuator.ConfigureNetHTTPHandler(&models.Config{}, mux)
Endpoints
Env - /actuator/env
This is used to get all the environment variables for the runtime where the application is running. Note that to use this, you need to pass the runtime environment as an application flag as follows.
go build
./${APPLICATION_NAME} -env=${ENVIRONMENT_NAME}
{
"env_key_1": "env_value_1",
"env_key_2": "env_value_2"
}
HTTP Trace - /actuator/httpTrace
This is used to get the trace for the last 100 HTTP requests to your application. Now if this has to be used, then there is an extra configuration has to be done based on the web framework in use.
import (
"github.com/gin-gonic/gin"
actuatorCore "github.com/sinhashubham95/go-actuator/core"
"github.com/valyala/fasthttp"
"net/http"
)
// Using with Fast HTTP
fasthttp.ListenAndServe(":8080", actuatorCore.WrapFastHTTPHandler(func (ctx *fasthttp.RequestCtx) {
// handle your request
}))
// Using with GIN
router := gin.Default()
router.Use(actuatorCore.GINTracer())
// Using with Net HTTP
mux := &http.ServeMux{}
mux.Handle("/route1", actuatorCore.WrapNetHTTPHandler(func (writer http.ResponseWriter, request *http.Request) {}))
mux.Handle("/route2", actuatorCore.WrapNetHTTPHandler(func (writer http.ResponseWriter, request *http.Request) {}))
[
{
"timestamp": "2019-08-05T19:28:36.353Z",
"duration": 1234,
"request": {
"method": "GET",
"url": "https://google.co.in",
"headers": {
"accept-language": [
"en-GB,en-US;q=0.9,en;q=0.8"
]
}
},
"response": {
"status": 200,
"headers": {
"content-type": [
"application/json"
]
}
}
}
]
Info - /actuator/info
This is used to get the basic information for an application. To get the correct and relevant information for your application you need to change the build script as well as the run script for your application as follows.
buildStamp=$(date -u '+%Y-%m-%d_%I:%M:%S%p')
commitId=$(git rev-list -1 HEAD)
commitTime=$(git show -s --format=%ci "$commitId")
commitAuthor=$(git --no-pager show -s --format='%an <%ae>' "$commitId")
gitUrl=$(git config --get remote.origin.url)
userName=$(whoami)
hostName=$(hostname)
go build -ldflags "<other linking params> -X github.com/sinhashubham95/info.BuildStamp=$buildStamp -X github.com/sinhashubham95/info.GitCommitID=$commitId -X github.com/sinhashubham95/info.GitPrimaryBranch=$2 -X github.com/sinhashubham95/info.GitURL=$gitUrl -X github.com/sinhashubham95/info.UserName=$userName -X github.com/sinhashubham95/info.HostName=$hostName -X \"github.com/sinhashubham95/info.GitCommitTime=$commitTime\" -X \"github.com/sinhashubham95/info.GitCommitAuthor=$commitAuthor\""
./${APPLICATION_NAME} -env=${ENVIRONMENT_NAME} -name=${APPLICATION_NAME} -port=${APPLICATION_PORT} -version=${APPLICATION_VERSION}
{
"application": {
"env": "ENVIRONMENT",
"name": "APPLICATION_NAME",
"version": "APPLICATION_VERSION"
},
"git": {
"username": "s0s01qp",
"hostName": "m-C02WV1L6HTD5",
"buildStamp": "2019-08-22_09:44:04PM",
"commitAuthor": "Shubham Sinha ",
"commitId": "836475215e3ecf0ef26e0d5b65a9db626568ef89",
"commitTime": "2019-08-23 02:27:26 +0530",
"branch": "master",
"url": "https://gecgithub01.walmart.com/RT-Integrated-Fulfillment/gif-ui-bff.git"
},
"runtime": {
"arch": "",
"os": "",
"port": 8080,
"runtimeVersion": ""
}
}
Metrics - /actuator/metrics
This is used to get the runtime memory statistics for your application. You can find the definition of each of the fields here.
{}
Ping - /actuator/ping
This is the lightweight ping endpoint that can be used along with your load balancer. This is used to know the running status of your application.
Shutdown - /actuator/shutdown
This is used to bring the application down.
Thread dump - /actuator/threadDump
This is used to get the trace of all the goroutines.