From fa9f6b9f8feb36425ee64a0249869437689553b2 Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Tue, 27 Oct 2026 15:32:12 -0700 Subject: [PATCH 1/4] Ensure the local `cvd` directory exists There are cases where another logic path fails and the directory has not yet been created. This logic defensively ensures that will not happen. Bug: 576310224 --- base/cvd/cuttlefish/metrics/io/unique_id_file.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/base/cvd/cuttlefish/metrics/io/unique_id_file.cc b/base/cvd/cuttlefish/metrics/io/unique_id_file.cc index d09d1724e94..239e90fc058 100644 --- a/base/cvd/cuttlefish/metrics/io/unique_id_file.cc +++ b/base/cvd/cuttlefish/metrics/io/unique_id_file.cc @@ -46,6 +46,7 @@ Result GenerateUniqueIdFile(const std::string& directory, return {}; } const std::string unique_id = GenerateUuid(); + CF_EXPECT(EnsureDirectoryExists(directory)); CF_EXPECT(WriteNewFile(filepath, unique_id)); return {}; } From d7bd9d1cfecd8978b3fe155d6a6ed9f3af2bad64 Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Tue, 27 Oct 2026 15:36:07 -0700 Subject: [PATCH 2/4] Allow `user_id` lookup to fail Trying to be strict about requiring the value continues to craete metrics failures in new environments due to the non-local nature of the unique `user_id` file. That is causing no metrics to be transmitted at all, which is strictly a worse case. We can look for blocks of data where the field is not populated and try to resolve those issues after deployment, but we want to get most of the data. Bug: 576310224 --- base/cvd/cuttlefish/metrics/host/host_metrics.cc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/base/cvd/cuttlefish/metrics/host/host_metrics.cc b/base/cvd/cuttlefish/metrics/host/host_metrics.cc index ee6640fba85..6236ce62219 100644 --- a/base/cvd/cuttlefish/metrics/host/host_metrics.cc +++ b/base/cvd/cuttlefish/metrics/host/host_metrics.cc @@ -17,7 +17,6 @@ #include "cuttlefish/metrics/host/host_metrics.h" #include -#include #include "cuttlefish/common/libs/utils/host_info.h" #include "cuttlefish/metrics/host/gce_environment.h" @@ -47,15 +46,10 @@ Result GetEnvironment() { } // namespace Result GetHostMetrics() { - Invoker invoker = GetInvoker(); - std::string user_id; - if (invoker != Invoker::Podcvd) { - user_id = CF_EXPECT(ReadUserIdFile()); - } return HostMetrics{.os = GetHostInfo(), - .invoker = invoker, + .invoker = GetInvoker(), .environment = CF_EXPECT(GetEnvironment()), - .user_id = user_id}; + .user_id = ReadUserIdFile().value_or("")}; } } // namespace cuttlefish From e9068919271b70643834f836b727f7de38e3f7ff Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Tue, 27 Oct 2026 15:45:08 -0700 Subject: [PATCH 3/4] Same as `user_id` reading, allow failures See previous commit for reasoning. Too many possible failures to be so strict. Bug: 576310224 --- base/cvd/cuttlefish/metrics/BUILD.bazel | 2 +- base/cvd/cuttlefish/metrics/metrics_orchestration.cc | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/base/cvd/cuttlefish/metrics/BUILD.bazel b/base/cvd/cuttlefish/metrics/BUILD.bazel index be80b12d456..69d70f654ab 100644 --- a/base/cvd/cuttlefish/metrics/BUILD.bazel +++ b/base/cvd/cuttlefish/metrics/BUILD.bazel @@ -70,12 +70,12 @@ cf_cc_library( "//cuttlefish/metrics/conversion:metrics_data", "//cuttlefish/metrics/external_proto:cf_log_cc_proto", "//cuttlefish/metrics/host:host_metrics", - "//cuttlefish/metrics/host:invoker", "//cuttlefish/metrics/io:enabled", "//cuttlefish/metrics/io:metrics_transmitter", "//cuttlefish/metrics/io:metrics_writer", "//cuttlefish/metrics/io:unique_id_file", "//cuttlefish/result", + "@abseil-cpp//absl/log", "@fmt", ], ) diff --git a/base/cvd/cuttlefish/metrics/metrics_orchestration.cc b/base/cvd/cuttlefish/metrics/metrics_orchestration.cc index f941a19db2f..677f54c9574 100644 --- a/base/cvd/cuttlefish/metrics/metrics_orchestration.cc +++ b/base/cvd/cuttlefish/metrics/metrics_orchestration.cc @@ -22,6 +22,7 @@ #include #include +#include "absl/log/log.h" #include "fmt/format.h" #include "cuttlefish/common/libs/utils/files.h" @@ -31,7 +32,6 @@ #include "cuttlefish/metrics/conversion/metrics_data.h" #include "cuttlefish/metrics/external_proto/cf_log.pb.h" #include "cuttlefish/metrics/host/host_metrics.h" -#include "cuttlefish/metrics/host/invoker.h" #include "cuttlefish/metrics/io/enabled.h" #include "cuttlefish/metrics/io/metrics_transmitter.h" #include "cuttlefish/metrics/io/metrics_writer.h" @@ -53,9 +53,9 @@ std::chrono::milliseconds GetEpochTime() { Result SetUpMetrics(const std::string& metrics_directory) { CF_EXPECT(EnsureDirectoryExists(metrics_directory)); CF_EXPECT(GenerateSessionIdFile(metrics_directory)); - // TODO: b/578071683 - remove restriction once user id filepath is writable - if (GetInvoker() != Invoker::Podcvd) { - CF_EXPECT(GenerateUserIdFile()); + Result user_id_result = GenerateUserIdFile(); + if (!user_id_result) { + VLOG(0) << "Failed to generate user ID file: " << user_id_result.error(); } return {}; } From 0b042c7018dfc923e1a114f5c7372798e33de912 Mon Sep 17 00:00:00 2001 From: Chad Reynolds Date: Tue, 27 Oct 2026 15:50:18 -0700 Subject: [PATCH 4/4] Use the invoker helper elsewhere No need to expose the lookup mechanism or environment variable strings. --- base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel | 1 + base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc | 4 ++-- base/cvd/cuttlefish/host/commands/run_cvd/launch/BUILD.bazel | 2 +- .../cvd/cuttlefish/host/commands/run_cvd/launch/streamer.cpp | 5 ++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel index 9bc3656d75c..19e08b05878 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/BUILD.bazel @@ -387,6 +387,7 @@ cf_cc_library( "//cuttlefish/host/libs/config/defaults", "//cuttlefish/host/libs/vhal_proxy_server", "//cuttlefish/host/libs/vm_manager", + "//cuttlefish/metrics/host:invoker", "//cuttlefish/result", "@abseil-cpp//absl/log", "@abseil-cpp//absl/strings", diff --git a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc index 09fb9f74b56..83217c9d9b2 100644 --- a/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc +++ b/base/cvd/cuttlefish/host/commands/assemble_cvd/flags.cc @@ -48,7 +48,6 @@ #include "cuttlefish/common/libs/utils/base64.h" #include "cuttlefish/common/libs/utils/container.h" #include "cuttlefish/common/libs/utils/contains.h" -#include "cuttlefish/common/libs/utils/environment.h" #include "cuttlefish/common/libs/utils/files.h" #include "cuttlefish/common/libs/utils/host_info.h" #include "cuttlefish/common/libs/utils/known_paths.h" @@ -109,6 +108,7 @@ #include "cuttlefish/host/libs/vm_manager/gem5_manager.h" #include "cuttlefish/host/libs/vm_manager/qemu_manager.h" #include "cuttlefish/host/libs/vm_manager/vm_manager.h" +#include "cuttlefish/metrics/host/invoker.h" #include "cuttlefish/result/result.h" #define GET_FLAG_STR_VALUE(name) \ @@ -915,7 +915,7 @@ Result InitializeCuttlefishConfiguration( (default_on_arch.find( guest_configs[instance_index].target_arch) != default_on_arch.end() || - StringFromEnv("CVD_INVOKER").value_or("") == "podcvd")) { + GetInvoker() == Invoker::Podcvd)) { instance.set_vhost_user_vsock(true); } else { instance.set_vhost_user_vsock(false); diff --git a/base/cvd/cuttlefish/host/commands/run_cvd/launch/BUILD.bazel b/base/cvd/cuttlefish/host/commands/run_cvd/launch/BUILD.bazel index bf16e1b0f89..6dad647f911 100644 --- a/base/cvd/cuttlefish/host/commands/run_cvd/launch/BUILD.bazel +++ b/base/cvd/cuttlefish/host/commands/run_cvd/launch/BUILD.bazel @@ -461,7 +461,6 @@ cf_cc_library( hdrs = ["streamer.h"], deps = [ "//cuttlefish/common/libs/fs", - "//cuttlefish/common/libs/utils:environment", "//cuttlefish/common/libs/utils:files", "//cuttlefish/host/commands/run_cvd:reporting", "//cuttlefish/host/commands/run_cvd/launch:enable_multitouch", @@ -475,6 +474,7 @@ cf_cc_library( "//cuttlefish/host/libs/config:gpu_mode", "//cuttlefish/host/libs/config:known_paths", "//cuttlefish/host/libs/feature", + "//cuttlefish/metrics/host:invoker", "//cuttlefish/posix:strerror", "//cuttlefish/process:command", "//cuttlefish/process:subprocess", diff --git a/base/cvd/cuttlefish/host/commands/run_cvd/launch/streamer.cpp b/base/cvd/cuttlefish/host/commands/run_cvd/launch/streamer.cpp index f5154486eb0..3273e0a92f8 100644 --- a/base/cvd/cuttlefish/host/commands/run_cvd/launch/streamer.cpp +++ b/base/cvd/cuttlefish/host/commands/run_cvd/launch/streamer.cpp @@ -17,7 +17,6 @@ #include -#include #include #include #include @@ -31,7 +30,6 @@ #include "fruit/macro.h" #include "cuttlefish/common/libs/fs/shared_fd.h" -#include "cuttlefish/common/libs/utils/environment.h" #include "cuttlefish/common/libs/utils/files.h" #include "cuttlefish/host/commands/run_cvd/launch/enable_multitouch.h" #include "cuttlefish/host/commands/run_cvd/launch/input_paths_provider.h" @@ -47,6 +45,7 @@ #include "cuttlefish/host/libs/feature/command_source.h" #include "cuttlefish/host/libs/feature/feature.h" #include "cuttlefish/host/libs/feature/kernel_log_pipe_provider.h" +#include "cuttlefish/metrics/host/invoker.h" #include "cuttlefish/posix/strerror.h" #include "cuttlefish/process/command.h" #include "cuttlefish/process/subprocess.h" @@ -225,7 +224,7 @@ class WebRtcServer : public virtual CommandSource, return {}; } std::string url; - if (StringFromEnv("CVD_INVOKER").value_or("") == "podcvd") { + if (GetInvoker() == Invoker::Podcvd) { // Container image used by podcvd always contains `cuttlefish-user` debian // package. URL starting with `https://localhost:1443` is required as port // 1443 in the container is exposed via port forwarding. When printing