in prod/native/libcommon/code/Diagnostics.cpp [55:94]
static void getDiagnosticInformation(std::ostream &out, elasticapm::php::PhpBridgeInterface const &bridge) {
out << std::setfill(detail::separator) << std::setw(detail::separatorWidth) << detail::separator << std::endl;
out << "Elastic Distribution for OpenTelemetry PHP diagnostics:" << std::endl;
out << std::setfill(detail::separator) << std::setw(detail::separatorWidth) << detail::separator << std::endl;
std::time_t time = std::time({});
char timeString[std::size("yyyy-mm-ddThh:mm:ssZ")];
std::strftime(std::data(timeString), std::size(timeString), "%FT%TZ", std::gmtime(&time));
out << "Time: " << timeString << " UTC (" << std::chrono::milliseconds(time).count() << ')' << std::endl;
out << "PID: " << getpid() << std::endl;
out << "PPID: " << getppid() << std::endl;
out << "UID: " << getuid() << std::endl;
auto extensions = bridge.getExtensionList();
if (extensions.size() > 0) {
out << std::setfill(detail::separator) << std::setw(detail::separatorWidth) << detail::separator << std::endl;
out << "Loaded extensions:" << std::endl;
out << std::setfill(detail::separator) << std::setw(detail::separatorWidth) << detail::separator << std::endl;
for (auto const &extension : extensions) {
out << extension.name << " " << extension.version << std::endl;
}
}
out << std::setfill(detail::separator) << std::setw(detail::separatorWidth) << detail::separator << std::endl << std::endl;
out << "phpinfo() output:" << std::endl;
out << std::setfill(detail::separator) << std::setw(detail::separatorWidth) << detail::separator << std::endl;
out << bridge.getPhpInfo() << std::endl;
getProcessDiags(out, "maps");
getProcessDiags(out, "smaps_rollup");
getProcessDiags(out, "status");
getProcessDiags(out, "limits");
getProcessDiags(out, "cgroup");
getProcessDiags(out, "cmdline");
getProcessDiags(out, "mountinfo");
getProcessDiags(out, "mounts");
getProcessDiags(out, "mountstats");
getProcessDiags(out, "stat");
}