diff --git a/doc/maintainers.md b/doc/maintainers.md index 8db4cd3a..d36ee126 100644 --- a/doc/maintainers.md +++ b/doc/maintainers.md @@ -385,7 +385,6 @@ david@ein:~/src/dd-trace-cpp/src/datadog$ sed -n 's/^\s*\(\w\+\)\s*=\s*[0-9]\+,\ 1 SPAN_SAMPLING_RULES_MAX_PER_SECOND_WRONG_TYPE 1 SPAN_SAMPLING_RULES_INVALID_JSON 1 SPAN_SAMPLING_RULES_FILE_IO - 1 SERVICE_NAME_REQUIRED 1 RULE_WRONG_TYPE 1 RULE_TAG_WRONG_TYPE 1 RULE_PROPERTY_WRONG_TYPE diff --git a/include/datadog/error.h b/include/datadog/error.h index fdc0dc33..bb7b88c6 100644 --- a/include/datadog/error.h +++ b/include/datadog/error.h @@ -24,7 +24,7 @@ struct Error { // versions. enum Code { OTHER = 1, - SERVICE_NAME_REQUIRED = 2, + // SERVICE_NAME_REQUIRED = 2, MESSAGEPACK_ENCODE_FAILURE = 3, CURL_REQUEST_FAILURE = 4, DATADOG_AGENT_NULL_HTTP_CLIENT = 5, diff --git a/src/datadog/platform_util.cpp b/src/datadog/platform_util.cpp index 600f4309..a270686b 100644 --- a/src/datadog/platform_util.cpp +++ b/src/datadog/platform_util.cpp @@ -189,6 +189,29 @@ int get_process_id() { #endif } +std::string get_process_name() { +#if defined(__APPLE__) || defined(__FreeBSD__) + char* process_name = getprogname(); + return (process_name != nullptr) ? process_name : "unknown-service"; +#elif defined(__linux__) || defined(__unix__) + return program_invocation_short_name; +#elif defined(_MSC_VER) + TCHAR exe_name[MAX_PATH]; + if (GetModuleFileName(NULL, exe_name, MAX_PATH) <= 0) { + return "unknown-service"; + } +#ifdef UNICODE + std::wstring wStr(exe_name); + std::string path = std::string(wStr.begin(), wStr.end()); +#else + std::string path = std::string(exe_name); +#endif + return path.substr(path.find_last_of("/\\") + 1); +#else + return "unknown-service"; +#endif +} + int at_fork_in_child(void (*on_fork)()) { #if defined(_MSC_VER) // Windows does not have `fork`, and so this is not relevant there. diff --git a/src/datadog/platform_util.h b/src/datadog/platform_util.h index 7e1cfb75..cfadfecd 100644 --- a/src/datadog/platform_util.h +++ b/src/datadog/platform_util.h @@ -26,6 +26,8 @@ std::string get_hostname(); int get_process_id(); +std::string get_process_name(); + int at_fork_in_child(void (*on_fork)()); } // namespace tracing diff --git a/src/datadog/tracer_config.cpp b/src/datadog/tracer_config.cpp index 6cf0b280..ce6e8574 100644 --- a/src/datadog/tracer_config.cpp +++ b/src/datadog/tracer_config.cpp @@ -15,6 +15,7 @@ #include "datadog_agent.h" #include "json.hpp" #include "parse_util.h" +#include "platform_util.h" #include "string_util.h" namespace datadog { @@ -263,7 +264,7 @@ Expected finalize_config(const TracerConfig &user_config, pick(env_config->service, user_config.service, ""); if (final_config.defaults.service.empty()) { - return Error{Error::SERVICE_NAME_REQUIRED, "Service name is required."}; + final_config.defaults.service = get_process_name(); } final_config.metadata[ConfigName::SERVICE_NAME] = ConfigMetadata( diff --git a/test/system-tests/main.cpp b/test/system-tests/main.cpp index 85e4c012..516d8ac2 100644 --- a/test/system-tests/main.cpp +++ b/test/system-tests/main.cpp @@ -77,8 +77,6 @@ int main(int argc, char* argv[]) { datadog::tracing::TracerConfig config; config.logger = logger; config.agent.event_scheduler = event_scheduler; - config.service = "cpp-parametric-test"; - config.environment = "staging"; config.name = "http.request"; auto finalized_config = datadog::tracing::finalize_config(config); diff --git a/test/test_tracer_config.cpp b/test/test_tracer_config.cpp index 1050e216..940e2d55 100644 --- a/test/test_tracer_config.cpp +++ b/test/test_tracer_config.cpp @@ -145,16 +145,21 @@ class SomewhatSecureTemporaryFile : public std::fstream { TEST_CASE("TracerConfig::defaults") { TracerConfig config; - SECTION("service is required") { + SECTION("service is not required") { SECTION("empty") { auto finalized = finalize_config(config); - REQUIRE(!finalized); - REQUIRE(finalized.error().code == Error::SERVICE_NAME_REQUIRED); + REQUIRE(finalized); +#ifdef _MSC_VER + REQUIRE(finalized->defaults.service == "tests.exe"); +#else + REQUIRE(finalized->defaults.service == "tests"); +#endif } SECTION("nonempty") { config.service = "testsvc"; auto finalized = finalize_config(config); REQUIRE(finalized); + REQUIRE(finalized->defaults.service == "testsvc"); } }