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:
Joshua Lockerman 2019-01-17 13:18:47 -05:00 committed by JLockerman
parent 01be3946f2
commit fdaa7173fb
7 changed files with 78 additions and 6 deletions

View File

@ -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();

View File

@ -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

View File

@ -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");

View File

@ -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));

View File

@ -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);

View File

@ -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

View File

@ -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';