Skip to content

Commit dcbb00b

Browse files
heyamstrask
andauthored
Fix status exception in a readonly file system (#1967)
* Check readonly for StatusFile * Enable StatusFileTest * Address a comment * Check shouldWrite at callers * Revert Feature.java * Only log in app service env * Fix lgtm * Refactor * Revert directory * Update test * Prevent too early to call DiagnosticsHelper.userAppSvcRpIntegrationLogging * Remove a space in telemetry name * Remove plural * simplify a bit * Check parent dir * Add null check * Use writable instead of isReadOnly and disable StatusFileTest * Fix negation Co-authored-by: Trask Stalnaker <[email protected]> Co-authored-by: Trask Stalnaker <[email protected]>
1 parent 2efd911 commit dcbb00b

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

agent/agent-bootstrap/src/main/java/com/microsoft/applicationinsights/agent/bootstrap/diagnostics/status/StatusFile.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.concurrent.LinkedBlockingQueue;
4242
import java.util.concurrent.ThreadPoolExecutor;
4343
import java.util.concurrent.TimeUnit;
44+
import java.util.concurrent.atomic.AtomicBoolean;
4445
import okio.BufferedSink;
4546
import okio.Okio;
4647
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -84,6 +85,10 @@ public class StatusFile {
8485
// visible for testing
8586
static String directory;
8687

88+
private static final boolean writable;
89+
90+
private static final AtomicBoolean alreadyLogged = new AtomicBoolean();
91+
8792
private static final Object lock = new Object();
8893

8994
// guarded by lock
@@ -92,6 +97,8 @@ public class StatusFile {
9297
// guarded by lock
9398
private static BufferedSink buffer;
9499

100+
@Nullable public static Logger startupLogger;
101+
95102
private static final ThreadPoolExecutor WRITER_THREAD =
96103
new ThreadPoolExecutor(
97104
1, 1, 750L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), StatusFile::newThread);
@@ -109,6 +116,8 @@ public class StatusFile {
109116

110117
logDir = initLogDir();
111118
directory = logDir + STATUS_FILE_DIRECTORY;
119+
File dir = new File(logDir);
120+
writable = dir.canWrite();
112121
}
113122

114123
private static Thread newThread(Runnable r) {
@@ -138,9 +147,20 @@ public static String getLogDir() {
138147

139148
private StatusFile() {}
140149

141-
// visible for testing
142-
static boolean shouldWrite() {
143-
return DiagnosticsHelper.useAppSvcRpIntegrationLogging();
150+
private static boolean shouldWrite() {
151+
if (!DiagnosticsHelper.useAppSvcRpIntegrationLogging()) {
152+
return false;
153+
}
154+
if (writable) {
155+
return true;
156+
}
157+
// read-only app services, want to log warning once in this case
158+
if (startupLogger != null && !alreadyLogged.getAndSet(true)) {
159+
startupLogger.info(
160+
"Detected running on a read-only file system. Status json file won't be created. If this is unexpected, please check that process has write access to the directory: {}",
161+
directory);
162+
}
163+
return false;
144164
}
145165

146166
public static <T> void putValueAndWrite(String key, T value) {

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/MainEntryPoint.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public static void start(Instrumentation instrumentation, File javaagentFile) {
8989
rpConfiguration = RpConfigurationBuilder.create(agentPath);
9090
configuration = ConfigurationBuilder.create(agentPath, rpConfiguration);
9191
startupLogger = configureLogging(configuration.selfDiagnostics, agentPath);
92+
StatusFile.startupLogger = startupLogger;
9293
ConfigurationBuilder.logConfigurationWarnMessages();
9394
MDC.put(DiagnosticsHelper.MDC_PROP_OPERATION, "Startup");
9495
// TODO convert to agent builder concept

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/legacysdk/TelemetryClientClassFileTransformer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ public class TelemetryClientClassFileTransformer implements ClassFileTransformer
8686
return null;
8787
}
8888

89+
// TODO (heya) track this via FeatureStatsbeat
8990
StatusFile.putValueAndWrite("SDKPresent", true);
91+
9092
try {
9193
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
9294
TelemetryClientClassVisitor cv = new TelemetryClientClassVisitor(cw);

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/statsbeat/NetworkStatsbeat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
public class NetworkStatsbeat extends BaseStatsbeat {
3636

3737
private static final String REQUEST_SUCCESS_COUNT_METRIC_NAME = "Request Success Count";
38-
private static final String REQUEST_FAILURE_COUNT_METRIC_NAME = "Requests Failure Count ";
38+
private static final String REQUEST_FAILURE_COUNT_METRIC_NAME = "Request Failure Count";
3939
private static final String REQUEST_DURATION_METRIC_NAME = "Request Duration";
4040
private static final String RETRY_COUNT_METRIC_NAME = "Retry Count";
4141
private static final String THROTTLE_COUNT_METRIC_NAME = "Throttle Count";

0 commit comments

Comments
 (0)