Skip to content

Commit 35d71e4

Browse files
Merge pull request #881 from kuisathaverat/fix/866
fix: Fix No MonitoringAction found when open build log
2 parents 202ffaa + 399159c commit 35d71e4

File tree

3 files changed

+78
-38
lines changed

3 files changed

+78
-38
lines changed

src/main/java/io/jenkins/plugins/opentelemetry/OtelUtils.java

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,42 @@
55

66
package io.jenkins.plugins.opentelemetry;
77

8+
import java.nio.charset.StandardCharsets;
9+
import java.util.Arrays;
10+
import java.util.Collections;
11+
import java.util.Enumeration;
12+
import java.util.HashMap;
13+
import java.util.Iterator;
14+
import java.util.LinkedHashMap;
15+
import java.util.List;
16+
import java.util.Locale;
17+
import java.util.Map;
18+
import java.util.Objects;
19+
import java.util.Optional;
20+
import java.util.TreeMap;
21+
import java.util.function.Function;
22+
import java.util.logging.Level;
23+
import java.util.logging.Logger;
24+
import java.util.stream.Collectors;
25+
26+
import javax.servlet.http.HttpServletRequest;
27+
28+
import org.apache.commons.codec.net.URLCodec;
29+
import org.apache.commons.lang.StringUtils;
30+
import org.jenkinsci.plugins.workflow.graph.FlowNode;
31+
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
32+
import org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject;
33+
834
import com.google.common.collect.Iterators;
35+
936
import edu.umd.cs.findbugs.annotations.CheckForNull;
1037
import edu.umd.cs.findbugs.annotations.NonNull;
1138
import edu.umd.cs.findbugs.annotations.Nullable;
1239
import hudson.Plugin;
1340
import hudson.model.FreeStyleBuild;
1441
import hudson.model.Run;
1542
import hudson.util.VersionNumber;
43+
import io.jenkins.plugins.opentelemetry.job.MonitoringAction;
1644
import io.jenkins.plugins.opentelemetry.semconv.JenkinsOtelSemanticAttributes;
1745
import io.opentelemetry.api.common.AttributeKey;
1846
import io.opentelemetry.api.trace.Span;
@@ -30,28 +58,6 @@
3058
import jenkins.scm.api.SCMHead;
3159
import jenkins.scm.api.mixin.ChangeRequestSCMHead;
3260
import jenkins.scm.api.mixin.TagSCMHead;
33-
import org.apache.commons.codec.net.URLCodec;
34-
import org.apache.commons.lang.StringUtils;
35-
import org.jenkinsci.plugins.workflow.graph.FlowNode;
36-
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
37-
import org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject;
38-
39-
import javax.servlet.http.HttpServletRequest;
40-
import java.nio.charset.StandardCharsets;
41-
import java.util.Arrays;
42-
import java.util.Collections;
43-
import java.util.Enumeration;
44-
import java.util.HashMap;
45-
import java.util.Iterator;
46-
import java.util.LinkedHashMap;
47-
import java.util.List;
48-
import java.util.Locale;
49-
import java.util.Map;
50-
import java.util.Objects;
51-
import java.util.Optional;
52-
import java.util.TreeMap;
53-
import java.util.function.Function;
54-
import java.util.stream.Collectors;
5561

5662
public class OtelUtils {
5763

@@ -66,6 +72,8 @@ public class OtelUtils {
6672
public static final String TAG = "tag";
6773
public static final String JENKINS_CORE = "jenkins-core";
6874
public static final String UNKNOWN_VALUE = "#unknown";
75+
private static final Logger logger = Logger.getLogger(OtelUtils.class.getName());
76+
6977

7078
@CheckForNull
7179
public static String getSystemPropertyOrEnvironmentVariable(String environmentVariableName) {
@@ -321,4 +329,19 @@ public String get(@javax.annotation.Nullable HttpServletRequest request, @NonNul
321329
.orElse(null);
322330
}
323331
}
332+
333+
/**
334+
* Check if the run has Opentelemetry data
335+
* To validate it search for the MonitoringAction in the build actions.
336+
* @param run the Build
337+
* @return true if the run has Opentelemetry data
338+
*/
339+
public static boolean hasOpentelemetryData(Run<?, ?> run){
340+
MonitoringAction monitoringAction = run.getAction(MonitoringAction.class);
341+
boolean ret = monitoringAction != null;
342+
if (!ret) {
343+
logger.log(Level.FINE, () -> "No MonitoringAction found in " + run);
344+
}
345+
return ret;
346+
}
324347
}

src/main/java/io/jenkins/plugins/opentelemetry/job/OtelEnvironmentContributorService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import hudson.Extension;
55
import hudson.model.Run;
66
import io.jenkins.plugins.opentelemetry.JenkinsOpenTelemetryPluginConfiguration;
7+
import io.jenkins.plugins.opentelemetry.OtelUtils;
78
import io.jenkins.plugins.opentelemetry.semconv.JenkinsOtelSemanticAttributes;
89
import io.jenkins.plugins.opentelemetry.semconv.OTelEnvironmentVariablesConventions;
910
import io.opentelemetry.api.baggage.Baggage;
@@ -50,10 +51,8 @@ public void addEnvironmentVariables(@NonNull Run run, @NonNull EnvVars envs, @No
5051
TextMapSetter<EnvVars> setter = (carrier, key, value) -> carrier.put(key.toUpperCase(), value);
5152
W3CBaggagePropagator.getInstance().inject(Context.current(), envs, setter);
5253
}
53-
MonitoringAction monitoringAction = run.getAction(MonitoringAction.class);
54-
if (monitoringAction == null) {
55-
LOGGER.log(Level.FINE, () -> "MonitoringAction NOT found on run " + run);
56-
} else {
54+
if (OtelUtils.hasOpentelemetryData(run)) {
55+
MonitoringAction monitoringAction = run.getAction(MonitoringAction.class);
5756
// Add visualization link as environment variables to provide visualization links in notifications (to GitHub, slack messages...)
5857
for (MonitoringAction.ObservabilityBackendLink link : monitoringAction.getLinks()) {
5958
// Default backend link got an empty environment variable.

src/main/java/io/jenkins/plugins/opentelemetry/job/log/OtelLogStorageFactory.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import hudson.model.Run;
1414
import io.jenkins.plugins.opentelemetry.JenkinsControllerOpenTelemetry;
1515
import io.jenkins.plugins.opentelemetry.OpenTelemetryLifecycleListener;
16+
import io.jenkins.plugins.opentelemetry.OtelUtils;
17+
import io.jenkins.plugins.opentelemetry.job.MonitoringAction;
1618
import io.jenkins.plugins.opentelemetry.job.OtelTraceService;
1719
import io.opentelemetry.api.incubator.events.EventLogger;
1820
import io.opentelemetry.api.logs.LoggerProvider;
@@ -54,30 +56,46 @@ static OtelLogStorageFactory get() {
5456
return ExtensionList.lookupSingleton(OtelLogStorageFactory.class);
5557
}
5658

59+
/**
60+
* Create a LogStorage for a given FlowExecutionOwner
61+
* @param owner the FlowExecutionOwner
62+
* @return the LogStorage, null if no Opentelemetry data is found, or a BrokenLogStorage if an error occurs.
63+
*/
5764
@Nullable
5865
@Override
5966
public LogStorage forBuild(@NonNull final FlowExecutionOwner owner) {
67+
LogStorage ret = null;
6068
if (!getJenkinsControllerOpenTelemetry().isLogsEnabled()) {
6169
logger.log(Level.FINE, () -> "OTel Logs disabled");
62-
return null;
70+
return ret;
6371
}
64-
6572
try {
6673
Queue.Executable exec = owner.getExecutable();
67-
if (exec instanceof Run) {
68-
Run<?, ?> run = (Run<?, ?>) exec;
69-
70-
logger.log(Level.FINEST, () -> "forBuild(" + run + ")");
71-
72-
return new OtelLogStorage(run, getOtelTraceService(), tracer);
73-
} else {
74-
return null;
75-
}
74+
ret = forExec(exec);
7675
} catch (IOException x) {
77-
return new BrokenLogStorage(x);
76+
ret = new BrokenLogStorage(x);
7877
}
78+
return ret;
7979
}
8080

81+
/**
82+
* Create a LogStorage for a given Queve Executable
83+
* @param exec the Queue Executable
84+
* @return the LogStorage or null if no Opentelemetry data is found
85+
*/
86+
@Nullable
87+
private LogStorage forExec(@NonNull Queue.Executable exec){
88+
LogStorage ret = null;
89+
if (exec instanceof Run) {
90+
Run<?, ?> run = (Run<?, ?>) exec;
91+
if(OtelUtils.hasOpentelemetryData(run)){
92+
logger.log(Level.FINEST, () -> "forExec(" + run + ")");
93+
ret = new OtelLogStorage(run, getOtelTraceService(), tracer);
94+
}
95+
}
96+
return ret;
97+
}
98+
8199
/**
82100
* Workaround dependency injection problem. @Inject doesn't work here
83101
*/

0 commit comments

Comments
 (0)