mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-15 01:53:41 +08:00
Update telemetry with prettier os info
The info gotten from uname is difficult to work with, so read the os name from /etc/os-release if it's available.
This commit is contained in:
parent
01be3946f2
commit
fdaa7173fb
@ -32,3 +32,5 @@ GRANT SELECT ON _timescaledb_internal.bgw_policy_chunk_stats TO PUBLIC;
|
||||
|
||||
DROP FUNCTION IF EXISTS _timescaledb_internal.drop_chunks_impl(REGCLASS, "any", "any", BOOLEAN);
|
||||
DROP FUNCTION IF EXISTS drop_chunks("any", NAME, NAME, BOOLEAN, "any");
|
||||
|
||||
DROP FUNCTION IF EXISTS _timescaledb_internal.get_os_info();
|
||||
|
@ -6,7 +6,7 @@ CREATE OR REPLACE FUNCTION _timescaledb_internal.get_git_commit() RETURNS TEXT
|
||||
AS '@MODULE_PATHNAME@', 'ts_get_git_commit' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||
|
||||
CREATE OR REPLACE FUNCTION _timescaledb_internal.get_os_info()
|
||||
RETURNS TABLE(sysname TEXT, version TEXT, release TEXT)
|
||||
RETURNS TABLE(sysname TEXT, version TEXT, release TEXT, version_pretty TEXT)
|
||||
AS '@MODULE_PATHNAME@', 'ts_get_os_info' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
|
||||
|
||||
CREATE OR REPLACE FUNCTION get_telemetry_report() RETURNS TEXT
|
||||
|
@ -40,6 +40,7 @@
|
||||
#define REQ_OS "os_name"
|
||||
#define REQ_OS_VERSION "os_version"
|
||||
#define REQ_OS_RELEASE "os_release"
|
||||
#define REQ_OS_VERSION_PRETTY "os_name_pretty"
|
||||
#define REQ_PS_VERSION "postgresql_version"
|
||||
#define REQ_TS_VERSION "timescaledb_version"
|
||||
#define REQ_BUILD_OS "build_os_name"
|
||||
@ -223,6 +224,8 @@ build_version_body(void)
|
||||
ts_jsonb_add_str(parseState, REQ_OS, osinfo.sysname);
|
||||
ts_jsonb_add_str(parseState, REQ_OS_VERSION, osinfo.version);
|
||||
ts_jsonb_add_str(parseState, REQ_OS_RELEASE, osinfo.release);
|
||||
if (osinfo.has_pretty_version)
|
||||
ts_jsonb_add_str(parseState, REQ_OS_VERSION_PRETTY, osinfo.pretty_version);
|
||||
}
|
||||
else
|
||||
ts_jsonb_add_str(parseState, REQ_OS, "Unknown");
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <utils/builtins.h>
|
||||
#include <funcapi.h>
|
||||
#include <fmgr.h>
|
||||
#include <storage/fd.h>
|
||||
|
||||
#include "fmgr.h"
|
||||
#include "compat.h"
|
||||
@ -82,6 +83,63 @@ error:
|
||||
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#define OS_RELEASE_FILE "/etc/os-release"
|
||||
#define MAX_READ_LEN 1024
|
||||
|
||||
#define NAME_FIELD "PRETTY_NAME=\""
|
||||
|
||||
static bool
|
||||
get_pretty_version(char *pretty_version)
|
||||
{
|
||||
FILE *version_file;
|
||||
char *contents = palloc(MAX_READ_LEN);
|
||||
size_t bytes_read;
|
||||
bool got_pretty_version = false;
|
||||
int i;
|
||||
|
||||
memset(pretty_version, '\0', VERSION_INFO_LEN);
|
||||
|
||||
/* we cannot use pg_read_file because it doesn't allow absolute paths */
|
||||
version_file = AllocateFile(OS_RELEASE_FILE, PG_BINARY_R);
|
||||
if (version_file == NULL)
|
||||
return false;
|
||||
|
||||
fseeko(version_file, 0, SEEK_SET);
|
||||
|
||||
bytes_read = fread(contents, 1, (size_t) MAX_READ_LEN, version_file);
|
||||
|
||||
if (bytes_read <= 0)
|
||||
goto cleanup;
|
||||
|
||||
if (bytes_read < MAX_READ_LEN)
|
||||
contents[bytes_read] = '\0';
|
||||
else
|
||||
contents[MAX_READ_LEN - 1] = '\0';
|
||||
|
||||
contents = strstr(contents, NAME_FIELD);
|
||||
|
||||
if (contents == NULL)
|
||||
goto cleanup;
|
||||
|
||||
contents += sizeof(NAME_FIELD) - 1;
|
||||
|
||||
for (i = 0; i < (VERSION_INFO_LEN - 1); i++)
|
||||
{
|
||||
char c = contents[i];
|
||||
|
||||
if (c == '\0' || c == '\n' || c == '\r' || c == '"')
|
||||
break;
|
||||
|
||||
pretty_version[i] = c;
|
||||
}
|
||||
|
||||
got_pretty_version = true;
|
||||
|
||||
cleanup:
|
||||
FreeFile(version_file);
|
||||
return got_pretty_version;
|
||||
}
|
||||
|
||||
bool
|
||||
ts_version_get_os_info(VersionOSInfo *info)
|
||||
{
|
||||
@ -94,6 +152,7 @@ ts_version_get_os_info(VersionOSInfo *info)
|
||||
strncpy(info->sysname, os_info.sysname, VERSION_INFO_LEN - 1);
|
||||
strncpy(info->version, os_info.version, VERSION_INFO_LEN - 1);
|
||||
strncpy(info->release, os_info.release, VERSION_INFO_LEN - 1);
|
||||
info->has_pretty_version = get_pretty_version(info->pretty_version);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -112,8 +171,8 @@ Datum
|
||||
ts_get_os_info(PG_FUNCTION_ARGS)
|
||||
{
|
||||
TupleDesc tupdesc;
|
||||
Datum values[3];
|
||||
bool nulls[3] = {false};
|
||||
Datum values[4];
|
||||
bool nulls[4] = {false};
|
||||
HeapTuple tuple;
|
||||
VersionOSInfo info;
|
||||
|
||||
@ -128,6 +187,10 @@ ts_get_os_info(PG_FUNCTION_ARGS)
|
||||
values[0] = CStringGetTextDatum(info.sysname);
|
||||
values[1] = CStringGetTextDatum(info.version);
|
||||
values[2] = CStringGetTextDatum(info.release);
|
||||
if (info.has_pretty_version)
|
||||
values[3] = CStringGetTextDatum(info.pretty_version);
|
||||
else
|
||||
nulls[3] = true;
|
||||
}
|
||||
else
|
||||
memset(nulls, true, sizeof(nulls));
|
||||
|
@ -15,6 +15,8 @@ typedef struct VersionOSInfo
|
||||
char sysname[VERSION_INFO_LEN];
|
||||
char version[VERSION_INFO_LEN];
|
||||
char release[VERSION_INFO_LEN];
|
||||
char pretty_version[VERSION_INFO_LEN];
|
||||
bool has_pretty_version;
|
||||
} VersionOSInfo;
|
||||
|
||||
extern bool ts_version_get_os_info(VersionOSInfo *info);
|
||||
|
@ -282,8 +282,9 @@ WARNING: telemetry could not connect to "noservice.timescale.com"
|
||||
(1 row)
|
||||
|
||||
SET timescaledb.telemetry_level=off;
|
||||
select json_object_keys(get_telemetry_report()::json);
|
||||
json_object_keys
|
||||
SELECT * FROM json_object_keys(get_telemetry_report()::json) AS key
|
||||
WHERE key != 'os_name_pretty';
|
||||
key
|
||||
---------------------
|
||||
db_uuid
|
||||
license
|
||||
|
@ -121,4 +121,5 @@ SELECT _timescaledb_internal.test_telemetry_main_conn('noservice.timescale.com',
|
||||
SET timescaledb.telemetry_level=off;
|
||||
|
||||
|
||||
select json_object_keys(get_telemetry_report()::json);
|
||||
SELECT * FROM json_object_keys(get_telemetry_report()::json) AS key
|
||||
WHERE key != 'os_name_pretty';
|
||||
|
Loading…
x
Reference in New Issue
Block a user