(http://fleegix.org)",license:"Apache-2.0",main:"./lib/ejs.js",repository:{type:"git",url:"git://github.com/mde/ejs.git"},bugs:"https://github.com/mde/ejs/issues",homepage:"https://github.com/mde/ejs",dependencies:{},devDependencies:{browserify:"^13.1.1",eslint:"^4.14.0","git-directory-deploy":"^1.5.1",jake:"^10.3.1",jsdoc:"^3.4.0","lru-cache":"^4.0.1",mocha:"^5.0.5","uglify-js":"^3.3.16"},engines:{node:">=0.10.0"},scripts:{test:"mocha",postinstall:"node --harmony ./postinstall.js"}}},{}]},{},[1])(1)});
diff --git a/cmd/agent/gui/views/private/js/javascript.js b/cmd/agent/gui/views/private/js/javascript.js
index 66d800a586e34..d8c6c9eb25ed6 100644
--- a/cmd/agent/gui/views/private/js/javascript.js
+++ b/cmd/agent/gui/views/private/js/javascript.js
@@ -124,7 +124,7 @@ function checkStatus() {
if (checkStatus.uptime > last_ts) {
$("#restart_status").hide()
}
- checkStatus.uptime = last_ts
+ checkStatus.uptime = last_ts
},function() {
$("#agent_status").html("Not connected
to Agent");
$("#agent_status").css({
@@ -153,28 +153,6 @@ function loadStatus(page) {
sendMessage("agent/status/" + page, "", "post",
function(data, status, xhr){
$("#" + page + "_status").html(DOMPurify.sanitize(data));
-
- // Get the trace-agent status
- sendMessage("agent/getConfig/apm_config.receiver_port", "", "GET",
- function(data, status, xhr) {
- var apmPort = data["apm_config.debug.port"];
- if (apmPort == null) {
- apmPort = "5012";
- }
- var url = "http://127.0.0.1:"+apmPort+"/debug/vars"
- $.ajax({
- url: url,
- type: "GET",
- success: function(data) {
- $("#apmStats > .stat_data").html(ejs.render(apmTemplate, data));
- },
- error: function() {
- $("#apmStats > .stat_data").text("Status: Not running or not on localhost.");
- }
- })
- }, function() {
- $("#apmStats > .stat_data").html("Could not obtain trace-agent port from API.");
- })
},function(){
$("#" + page + "_status").html("An error occurred.");
});
diff --git a/cmd/agent/gui/views/templates/generalStatus.tmpl b/cmd/agent/gui/views/templates/generalStatus.tmpl
index fd993865c4cdc..d60bcc18466cd 100644
--- a/cmd/agent/gui/views/templates/generalStatus.tmpl
+++ b/cmd/agent/gui/views/templates/generalStatus.tmpl
@@ -478,9 +478,61 @@
-
+
APM
- Loading...
+
+ {{- with .apmStats -}}
+ {{- if .error }}
+ Not running or unreachable on localhost:{{.port}}
+ Error: {{.error}}
+ {{- else}}
+ Status: Running
+ Pid: {{.pid}}
+ Uptime: {{.uptime}} seconds
+ Mem alloc: {{humanize .memstats.Alloc}} bytes
+ Hostname: {{.config.Hostname}}
+ Receiver: {{.config.ReceiverHost}}:{{.config.ReceiverPort}}
+ Endpoints:
+
+ {{- range $i, $e := .config.Endpoints}}
+ {{ $e.Host }}
+ {{- end }}
+
+ Receiver (previous minute)
+
+ {{- if eq (len .receiver) 0}}
+ No traces received in the previous minute.
+ {{ else }}
+ {{ range $i, $ts := .receiver }}
+ From {{if $ts.Lang}}{{ $ts.Lang }} {{ $ts.LangVersion }} ({{ $ts.Interpreter }}), client {{ $ts.TracerVersion }}{{else}}unknown clients{{end}}
+
+ Traces received: {{ $ts.TracesReceived }} ({{ humanize $ts.TracesBytes }} bytes)
+ Spans received: {{ $ts.SpansReceived }}
+ {{ with $ts.WarnString }}
+
WARNING: {{ . }}
+ {{ end }}
+
+ {{ end }}
+ {{ end }}
+
+ {{range $key, $value := .ratebyservice_filtered -}}
+ {{- if eq $key "service:,env:" -}}
+ Default priority sampling rate: {{percent $value}}%
+ {{- else}}
+ Priority sampling rate for '{{ $key }}': {{percent $value}}%
+ {{- end}}
+ {{- end }}
+
+ Writer (previous minute)
+
+ Traces: {{.trace_writer.Payloads}} payloads, {{.trace_writer.Traces}} traces, {{.trace_writer.Events}} events, {{humanize .trace_writer.Bytes}} bytes
+ {{- if gt .trace_writer.Errors 0.0}}WARNING: Traces API errors (1 min): {{.trace_writer.Errors}}{{end}}
+ Stats: {{.stats_writer.Payloads}} payloads, {{.stats_writer.StatsBuckets}} stats buckets, {{humanize .stats_writer.Bytes}} bytes
+ {{- if gt .stats_writer.Errors 0.0}}WARNING: Stats API errors (1 min): {{.stats_writer.Errors}}{{end}}
+
+ {{- end }}
+ {{ end }}
+
@@ -532,7 +584,8 @@
{{- end }}
{{ end }}
-
+
+
diff --git a/cmd/agent/gui/views/templates/index.tmpl b/cmd/agent/gui/views/templates/index.tmpl
index 78723c4b4e7b4..daed6e5788e09 100644
--- a/cmd/agent/gui/views/templates/index.tmpl
+++ b/cmd/agent/gui/views/templates/index.tmpl
@@ -8,7 +8,6 @@
-
diff --git a/cmd/agent/subcommands/status/command.go b/cmd/agent/subcommands/status/command.go
index 88b30ee873dc1..a86a5d61e0076 100644
--- a/cmd/agent/subcommands/status/command.go
+++ b/cmd/agent/subcommands/status/command.go
@@ -11,10 +11,8 @@ import (
"encoding/json"
"errors"
"fmt"
- "net/http"
"net/url"
"os"
- "time"
"go.uber.org/fx"
@@ -162,14 +160,6 @@ func requestStatus(config config.Component, cliParams *cliParams) error {
if err != nil {
return err
}
- // attach trace-agent status, if obtainable
- temp := make(map[string]interface{})
- if err := json.Unmarshal(r, &temp); err == nil {
- temp["apmStats"] = getAPMStatus(config)
- if newr, err := json.Marshal(temp); err == nil {
- r = newr
- }
- }
// The rendering is done in the client so that the agent has less work to do
if cliParams.prettyPrintJSON {
@@ -195,30 +185,6 @@ func requestStatus(config config.Component, cliParams *cliParams) error {
return nil
}
-// getAPMStatus returns a set of key/value pairs summarizing the status of the trace-agent.
-// If the status can not be obtained for any reason, the returned map will contain an "error"
-// key with an explanation.
-func getAPMStatus(config config.Component) map[string]interface{} {
- port := config.GetInt("apm_config.debug.port")
- url := fmt.Sprintf("http://localhost:%d/debug/vars", port)
- resp, err := (&http.Client{Timeout: 2 * time.Second}).Get(url)
- if err != nil {
- return map[string]interface{}{
- "port": port,
- "error": err.Error(),
- }
- }
- defer resp.Body.Close()
- status := make(map[string]interface{})
- if err := json.NewDecoder(resp.Body).Decode(&status); err != nil {
- return map[string]interface{}{
- "port": port,
- "error": err.Error(),
- }
- }
- return status
-}
-
func componentStatusCmd(log log.Component, config config.Component, cliParams *cliParams) error {
if len(cliParams.args) != 1 {
return fmt.Errorf("a component name must be specified")
diff --git a/pkg/status/apm/apm.go b/pkg/status/apm/apm.go
new file mode 100644
index 0000000000000..e5576ded12793
--- /dev/null
+++ b/pkg/status/apm/apm.go
@@ -0,0 +1,59 @@
+// Unless explicitly stated otherwise all files in this repository are licensed
+// under the Apache License Version 2.0.
+// This product includes software developed at Datadog (https://www.datadoghq.com/).
+// Copyright 2016-present Datadog, Inc.
+
+// Package apm fetch information about the apm agent.
+// This will, in time, be migrated to the apm agent component.
+package apm
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "sync"
+
+ apiutil "github.com/DataDog/datadog-agent/pkg/api/util"
+ "github.com/DataDog/datadog-agent/pkg/config"
+)
+
+// httpClients should be reused instead of created as needed. They keep cached TCP connections
+// that may leak otherwise
+var (
+ httpClient *http.Client
+ clientInitOnce sync.Once
+)
+
+func client() *http.Client {
+ clientInitOnce.Do(func() {
+ httpClient = apiutil.GetClient(false)
+ })
+
+ return httpClient
+}
+
+// GetAPMStatus returns a set of key/value pairs summarizing the status of the trace-agent.
+// If the status can not be obtained for any reason, the returned map will contain an "error"
+// key with an explanation.
+func GetAPMStatus() map[string]interface{} {
+ port := config.Datadog.GetInt("apm_config.debug.port")
+
+ c := client()
+ url := fmt.Sprintf("http://localhost:%d/debug/vars", port)
+ resp, err := apiutil.DoGet(c, url, apiutil.CloseConnection)
+ if err != nil {
+ return map[string]interface{}{
+ "port": port,
+ "error": err.Error(),
+ }
+ }
+
+ status := make(map[string]interface{})
+ if err := json.Unmarshal(resp, &status); err != nil {
+ return map[string]interface{}{
+ "port": port,
+ "error": err.Error(),
+ }
+ }
+ return status
+}
diff --git a/pkg/status/status.go b/pkg/status/status.go
index 21696dc0ac489..a3f86b0c6cabb 100644
--- a/pkg/status/status.go
+++ b/pkg/status/status.go
@@ -30,6 +30,7 @@ import (
"github.com/DataDog/datadog-agent/pkg/config/utils"
logsStatus "github.com/DataDog/datadog-agent/pkg/logs/status"
"github.com/DataDog/datadog-agent/pkg/snmp/traps"
+ "github.com/DataDog/datadog-agent/pkg/status/apm"
"github.com/DataDog/datadog-agent/pkg/status/collector"
"github.com/DataDog/datadog-agent/pkg/status/jmx"
"github.com/DataDog/datadog-agent/pkg/status/otlp"
@@ -82,6 +83,7 @@ func GetStatus(verbose bool, invAgent inventoryagent.Component) (map[string]inte
}
stats["processAgentStatus"] = GetProcessAgentStatus()
+ stats["apmStats"] = apm.GetAPMStatus()
if !config.Datadog.GetBool("no_proxy_nonexact_match") {
stats["TransportWarnings"] = httputils.GetNumberOfWarnings() > 0