diff --git a/pages/containers.go b/pages/containers.go
index 394c5d16..6eab760e 100644
--- a/pages/containers.go
+++ b/pages/containers.go
@@ -231,20 +231,21 @@ func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) e
}
data := &pageData{
- DisplayName: displayName,
- ContainerName: escapeContainerName(cont.Name),
- ParentContainers: parentContainers,
- Subcontainers: subcontainerLinks,
- Spec: cont.Spec,
- Stats: cont.Stats,
- MachineInfo: machineInfo,
- IsRoot: cont.Name == "/",
- ResourcesAvailable: cont.Spec.HasCpu || cont.Spec.HasMemory || cont.Spec.HasNetwork || cont.Spec.HasFilesystem,
- CpuAvailable: cont.Spec.HasCpu,
- MemoryAvailable: cont.Spec.HasMemory,
- NetworkAvailable: cont.Spec.HasNetwork,
- FsAvailable: cont.Spec.HasFilesystem,
- Root: rootDir,
+ DisplayName: displayName,
+ ContainerName: escapeContainerName(cont.Name),
+ ParentContainers: parentContainers,
+ Subcontainers: subcontainerLinks,
+ Spec: cont.Spec,
+ Stats: cont.Stats,
+ MachineInfo: machineInfo,
+ IsRoot: cont.Name == "/",
+ ResourcesAvailable: cont.Spec.HasCpu || cont.Spec.HasMemory || cont.Spec.HasNetwork || cont.Spec.HasFilesystem,
+ CpuAvailable: cont.Spec.HasCpu,
+ MemoryAvailable: cont.Spec.HasMemory,
+ NetworkAvailable: cont.Spec.HasNetwork,
+ FsAvailable: cont.Spec.HasFilesystem,
+ CustomMetricsAvailable: cont.Spec.HasCustomMetrics,
+ Root: rootDir,
}
err = pageTemplate.Execute(w, data)
if err != nil {
diff --git a/pages/containers_html.go b/pages/containers_html.go
index abc4ea28..4f822bee 100644
--- a/pages/containers_html.go
+++ b/pages/containers_html.go
@@ -221,6 +221,16 @@ const containersHtmlTemplate = `
{{end}}
+ {{if .CustomMetricsAvailable}}
+
+
+
Application Metrics
+
+
+
+ {{end}}
{{end}}
diff --git a/pages/docker.go b/pages/docker.go
index 599cb0ac..7e822c38 100644
--- a/pages/docker.go
+++ b/pages/docker.go
@@ -129,18 +129,19 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error
return err
}
data = &pageData{
- DisplayName: displayName,
- ContainerName: escapeContainerName(cont.Name),
- ParentContainers: parentContainers,
- Spec: cont.Spec,
- Stats: cont.Stats,
- MachineInfo: machineInfo,
- ResourcesAvailable: cont.Spec.HasCpu || cont.Spec.HasMemory || cont.Spec.HasNetwork,
- CpuAvailable: cont.Spec.HasCpu,
- MemoryAvailable: cont.Spec.HasMemory,
- NetworkAvailable: cont.Spec.HasNetwork,
- FsAvailable: cont.Spec.HasFilesystem,
- Root: rootDir,
+ DisplayName: displayName,
+ ContainerName: escapeContainerName(cont.Name),
+ ParentContainers: parentContainers,
+ Spec: cont.Spec,
+ Stats: cont.Stats,
+ MachineInfo: machineInfo,
+ ResourcesAvailable: cont.Spec.HasCpu || cont.Spec.HasMemory || cont.Spec.HasNetwork,
+ CpuAvailable: cont.Spec.HasCpu,
+ MemoryAvailable: cont.Spec.HasMemory,
+ NetworkAvailable: cont.Spec.HasNetwork,
+ FsAvailable: cont.Spec.HasFilesystem,
+ CustomMetricsAvailable: cont.Spec.HasCustomMetrics,
+ Root: rootDir,
}
}
diff --git a/pages/pages.go b/pages/pages.go
index 662be0a3..aaf60fa2 100644
--- a/pages/pages.go
+++ b/pages/pages.go
@@ -44,23 +44,24 @@ type keyVal struct {
}
type pageData struct {
- DisplayName string
- ContainerName string
- ParentContainers []link
- Subcontainers []link
- Spec info.ContainerSpec
- Stats []*info.ContainerStats
- MachineInfo *info.MachineInfo
- IsRoot bool
- ResourcesAvailable bool
- CpuAvailable bool
- MemoryAvailable bool
- NetworkAvailable bool
- FsAvailable bool
- Root string
- DockerStatus []keyVal
- DockerDriverStatus []keyVal
- DockerImages []manager.DockerImage
+ DisplayName string
+ ContainerName string
+ ParentContainers []link
+ Subcontainers []link
+ Spec info.ContainerSpec
+ Stats []*info.ContainerStats
+ MachineInfo *info.MachineInfo
+ IsRoot bool
+ ResourcesAvailable bool
+ CpuAvailable bool
+ MemoryAvailable bool
+ NetworkAvailable bool
+ FsAvailable bool
+ CustomMetricsAvailable bool
+ Root string
+ DockerStatus []keyVal
+ DockerDriverStatus []keyVal
+ DockerImages []manager.DockerImage
}
func init() {
diff --git a/pages/static/containers_js.go b/pages/static/containers_js.go
index e8d237f8..277deb82 100644
--- a/pages/static/containers_js.go
+++ b/pages/static/containers_js.go
@@ -645,6 +645,15 @@ function drawCharts(machineInfo, containerInfo) {
});
}
+ // Custom Metrics
+ if (containerInfo.spec.has_custom_metrics) {
+ steps.push(function() {
+ getCustomMetrics(window.cadvisor.rootDir, window.cadvisor.containerName, function(metricsInfo) {
+ drawCustomMetrics("custom-metrics-chart", containerInfo, metricsInfo)
+ });
+ });
+ }
+
stepExecute(steps);
}
@@ -696,12 +705,70 @@ function refreshStats() {
}
if (containerInfo.spec.has_network) {
startNetwork("network-selection", containerInfo);
+ }
+ if (containerInfo.spec.has_custom_metrics) {
+ startCustomMetrics("custom-metrics-chart", containerInfo);
}
}
drawCharts(machineInfo, containerInfo);
});
}
+function startCustomMetrics(elementId, containerInfo) {
+ var metrics = containerInfo.spec.custom_metrics;
+ var el=$("");
+ for (i = 0; i
";
+ el.append($(divText));
+ }
+ el.append($(""));
+
+ $("#"+elementId).append(el);
+}
+
+function getCustomMetrics(rootDir, containerName, callback) {
+ $.getJSON(rootDir + "api/v2.0/appmetrics/" + containerName)
+ .done(function(data) {
+ callback(data);
+ })
+ .fail(function(jqhxr, textStatus, error) {
+ callback([]);
+ });
+}
+
+function drawCustomMetrics(elementId, containerInfo, metricsInfo) {
+ if(metricsInfo.length == 0) {
+ return;
+ }
+
+ var metricSpec = containerInfo.spec.custom_metrics;
+
+ for (var containerName in metricsInfo) {
+ var container = metricsInfo[containerName];
+ for (i=0; i