From 9f8e8cf43c0705b1b947b6f990902c9ca0a05517 Mon Sep 17 00:00:00 2001 From: Alex Heneveld Date: Wed, 22 Jan 2025 21:14:07 +0000 Subject: [PATCH] better logging/tostring to subscriptions and lifecycle transitions --- .../core/entity/lifecycle/Lifecycle.java | 3 +- .../internal/LocalSubscriptionManager.java | 50 ++++++++++++------- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/Lifecycle.java b/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/Lifecycle.java index 68b316e396..daa5873c18 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/Lifecycle.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/Lifecycle.java @@ -33,6 +33,7 @@ import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.base.Preconditions; +import org.apache.brooklyn.util.time.Time; /** * An enumeration representing the status of an {@link org.apache.brooklyn.api.entity.Entity}. @@ -156,7 +157,7 @@ public boolean equals(Object obj) { @Override public String toString() { - return state+" @ "+timestampUtc+" / "+new Date(timestampUtc); + return state+" @ "+timestampUtc+" / "+ Time.makeDateStampStringZ(timestampUtc); } } diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java index 6d17612616..f1783967b4 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/LocalSubscriptionManager.java @@ -32,6 +32,7 @@ import org.apache.brooklyn.api.sensor.SensorEventListener; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.EntityInternal; +import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; import org.apache.brooklyn.core.sensor.AttributeMap; import org.apache.brooklyn.core.sensor.BasicSensorEvent; @@ -42,6 +43,8 @@ import org.apache.brooklyn.util.core.task.BasicTask; import org.apache.brooklyn.util.core.task.SingleThreadedScheduler; import org.apache.brooklyn.util.exceptions.Exceptions; +import org.apache.brooklyn.util.guava.Maybe; +import org.apache.brooklyn.util.javalang.Boxing; import org.apache.brooklyn.util.text.Identifiers; import org.apache.brooklyn.util.text.Strings; import org.slf4j.Logger; @@ -297,7 +300,7 @@ private void submitPublishEvent(final Subscription s, final SensorEvent event name.append(":"); } name.append(sensorName); - + description.append(sensorName); description.append(" on "); description.append(sourceName==null ? "" : sourceName); @@ -307,14 +310,11 @@ private void submitPublishEvent(final Subscription s, final SensorEvent event description.append(", "); description.append(s.subscriptionDescription); } - - if (includeDescriptionForSensorTask(event)) { + + String valueSummary = getValueSummaryOrNull(event.getValue()); + if (valueSummary!=null) { name.append(" "); - String vs = Strings.toStringWithValueForNull(event.getValue(), ""); - if (vs.length() > 200) vs = vs.substring(0, 196) + " ..."; - description.append(", value: "); - description.append(vs); - if (vs.length() < 40) name.append(vs); + name.append(valueSummary); } Map execFlags = MutableMap.of("tags", tags, "displayName", name.toString(), @@ -338,6 +338,10 @@ public void run() { boolean setEC; if (ec instanceof BasicExecutionContext) { oldEC = BasicExecutionContext.setPerThreadExecutionContext((BasicExecutionContext) ec); + final ExecutionContext ec2 = BrooklynTaskTags.getExecutionContext(tags); + if (ec2!=ec) { + BasicExecutionContext.setPerThreadExecutionContext((BasicExecutionContext) ec2); + } setEC = true; } else { setEC = false; @@ -398,15 +402,27 @@ private MutableList getPublishTags(final Subscription s, final Entity .addIfNotNull(source!=null ? BrooklynTaskTags.tagForTargetEntity(source) : null) .build(); } - - protected boolean includeDescriptionForSensorTask(SensorEvent event) { - // just do it for simple/quick things to avoid expensive toStrings - // (info is rarely useful, but occasionally it will be) - if (event.getValue()==null) return true; - Class clazz = event.getValue().getClass(); - if (clazz.isEnum() || clazz.isPrimitive() || Number.class.isAssignableFrom(clazz) || - clazz.equals(String.class)) return true; - return false; + + + protected String getValueSummaryOrNull(Object v) { + if (v==null) return ""; + Class clazz = v.getClass(); + if (clazz.isEnum() || v instanceof Enum) return v.toString(); + if (clazz.equals(String.class)) { + if (((String) v).length()<40) return (String) v; + return ((String) v).substring(0, 20)+"... (len "+((String) v).length()+")"; + } + if (Boxing.isPrimitiveOrBoxedObject(v)) return v.toString(); + if (Number.class.isAssignableFrom(clazz)) return v.toString(); + + if (v instanceof List) return "List:size="+(((Collection) v).size()); + if (v instanceof Set) return "Set:size="+(((Collection) v).size()); + if (v instanceof Collection) return v.getClass().getName()+":size="+(((Collection) v).size()); + if (v instanceof Map) return "Map:size="+(((Map) v).size()); + + if (v instanceof Lifecycle.Transition) return v.toString(); + + return null; } @Override