summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2017-12-08 15:35:17 +0100
committerHarald Musum <musum@oath.com>2017-12-08 15:35:17 +0100
commit5d6a7d4063aabb369f30944f49b1c2a922e12480 (patch)
tree73611911ddfc61b7a2df9c1caf56690ae6ad7cbc /container-core
parent688596c7f57933c87a070728e732691309cd68de (diff)
Make it possible to configure and change status code in /state/v1/health API
Make inital value configurable and make it possible to get and set it in StateMonitor
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java6
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/state/StateMonitor.java24
-rw-r--r--container-core/src/main/resources/configdefinitions/health-monitor.def3
3 files changed, 24 insertions, 9 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java
index ce9779b83d9..23c247fa438 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/StateHandler.java
@@ -190,7 +190,7 @@ public class StateHandler extends AbstractRequestHandler {
private JSONObjectWithLegibleException buildJsonForConsumer(String consumer) throws JSONException {
JSONObjectWithLegibleException ret = new JSONObjectWithLegibleException();
ret.put("time", timer.currentTimeMillis());
- ret.put("status", new JSONObjectWithLegibleException().put("code", "up"));
+ ret.put("status", new JSONObjectWithLegibleException().put("code", getStatus().name()));
ret.put(METRICS_PATH, buildJsonForSnapshot(consumer, getSnapshot()));
return ret;
}
@@ -203,6 +203,10 @@ public class StateHandler extends AbstractRequestHandler {
}
}
+ private StateMonitor.Status getStatus() {
+ return monitor.status();
+ }
+
private JSONObjectWithLegibleException buildJsonForSnapshot(String consumer, MetricSnapshot metricSnapshot) throws JSONException {
if (metricSnapshot == null) {
return new JSONObjectWithLegibleException();
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/StateMonitor.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/StateMonitor.java
index 140257cbcef..9af9956df06 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/state/StateMonitor.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/StateMonitor.java
@@ -14,7 +14,7 @@ import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
/**
- * A statemonitor keeps track of the current metrics state of a container.
+ * A state monitor keeps track of the current health and metrics state of a container.
* It is used by jDisc to hand out metric update API endpoints to workers through {@link #newMetricConsumer},
* and to inspect the current accumulated state of metrics through {@link #snapshot}.
*
@@ -23,12 +23,16 @@ import java.util.logging.Logger;
public class StateMonitor extends AbstractComponent {
private final static Logger log = Logger.getLogger(StateMonitor.class.getName());
+
+ public enum Status {up, down, initializing};
+
private final CopyOnWriteArrayList<StateMetricConsumer> consumers = new CopyOnWriteArrayList<>();
private final Thread thread;
private final Timer timer;
private final long snapshotIntervalMs;
private long lastSnapshotTimeMs;
private volatile MetricSnapshot snapshot;
+ private volatile Status status;
private final TreeSet<String> valueNames = new TreeSet<>();
@Inject
@@ -36,13 +40,9 @@ public class StateMonitor extends AbstractComponent {
this.timer = timer;
this.snapshotIntervalMs = (long)(config.snapshot_interval() * TimeUnit.SECONDS.toMillis(1));
this.lastSnapshotTimeMs = timer.currentTimeMillis();
- thread = new Thread(new Runnable() {
-
- @Override
- public void run() {
- StateMonitor.this.run();
- }
- }, "StateMonitor");
+ this.status = Status.valueOf(config.initialStatus());
+ System.out.println("Initial status: " + status);
+ thread = new Thread(StateMonitor.this::run, "StateMonitor");
thread.setDaemon(true);
thread.start();
}
@@ -54,6 +54,14 @@ public class StateMonitor extends AbstractComponent {
return consumer;
}
+ public void status(Status status) {
+ this.status = status;
+ }
+
+ public Status status() {
+ return status;
+ }
+
/** Returns the last snapshot taken of the metrics in this system */
public MetricSnapshot snapshot() {
return snapshot;
diff --git a/container-core/src/main/resources/configdefinitions/health-monitor.def b/container-core/src/main/resources/configdefinitions/health-monitor.def
index dc5cdbc6ca4..5e70c72ae3f 100644
--- a/container-core/src/main/resources/configdefinitions/health-monitor.def
+++ b/container-core/src/main/resources/configdefinitions/health-monitor.def
@@ -4,3 +4,6 @@ namespace=container.jdisc.config
# How far between snapshots. 5 minutes by default
snapshot_interval double default=300
+
+# Initial status used in /state/v1/health API (value for 'code' in 'status'). See StateMonitor for valid values
+initialStatus string default="up"