Skip to content

Commit

Permalink
Make telemetry files path configurable without enabling debug mode (#6)
Browse files Browse the repository at this point in the history
* Make telemetry files path configurable without enabling debug mode

* Add .gitignore

* Update .gitignore

* Update expected test results

* Update expected test results

* Update expected test results

* Refactoring

* Post merge fixes

* Fix

* Fix
  • Loading branch information
artemgavrilov committed May 23, 2024
1 parent 3fd139d commit 04043fb
Show file tree
Hide file tree
Showing 11 changed files with 60 additions and 34 deletions.
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Object files
*.o
*.ko
*.obj
*.elf
*.dylib

## IDE
.idea

## DS_Store
*.DS_Store

## .vscode
.vscode/
.vscode/*
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You can find the configuration parameters of the `percona_pg_telemetry` extensio
* Unit: boolean
* When set to `false`, the leader process terminates when the configuration is read.

2. `percona_pg_telemetry.pg_telemetry_folder`
2. `percona_pg_telemetry.path`

* Default: /usr/local/percona/telemetry/pg

Expand All @@ -39,7 +39,7 @@ You can find the configuration parameters of the `percona_pg_telemetry` extensio
* It forces the extension to maintain upto this number of files. Older files will get
removed and new files will be created.

> **NOTE** GUCs 2 - 4 are only visible if environment variable PT_DEBUG is set. This is prevent users in production environment to change these variables which are only for testing purposes.
> **NOTE** GUCs 3 - 4 are only visible if environment variable PT_DEBUG is set. This is prevent users in production environment to change these variables which are only for testing purposes.
#### Functions

Expand Down
6 changes: 3 additions & 3 deletions expected/basic.out
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ SELECT pg_sleep(3);
SELECT name
FROM pg_settings
WHERE name LIKE 'percona_pg_telemetry.%';
name
------------------------------------------
name
--------------------------------------
percona_pg_telemetry.enabled
percona_pg_telemetry.files_to_keep
percona_pg_telemetry.pg_telemetry_folder
percona_pg_telemetry.path
percona_pg_telemetry.scrape_interval
(4 rows)

Expand Down
3 changes: 2 additions & 1 deletion expected/basic_1.out
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ WHERE name LIKE 'percona_pg_telemetry.%';
name
------------------------------
percona_pg_telemetry.enabled
(1 row)
percona_pg_telemetry.path
(2 rows)

SELECT percona_pg_telemetry_version();
percona_pg_telemetry_version
Expand Down
4 changes: 2 additions & 2 deletions expected/debug_json.out
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ HAVING COUNT(*) = (
)
AS INTEGER
)
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name like '%pg_telemetry_folder') AS INTEGER)
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name = 'percona_pg_telemetry.path') AS INTEGER)
);
databases_count
-----------------
Expand All @@ -76,7 +76,7 @@ FROM pg_database
WHERE datallowconn = true
HAVING COUNT(*) = (
SELECT json_array_length(read_json_file()::JSON->'databases')
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name like '%pg_telemetry_folder') AS INTEGER)
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name = 'percona_pg_telemetry.path') AS INTEGER)
);
databases_count_calc
----------------------
Expand Down
2 changes: 1 addition & 1 deletion expected/gucs.out
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ max_val | 100
boot_val | 7
reset_val | 7
-[ RECORD 3 ]----------------------------------------------------
name | percona_pg_telemetry.pg_telemetry_folder
name | percona_pg_telemetry.path
setting | .
unit |
short_desc | Directory path for writing database info file(s)
Expand Down
9 changes: 9 additions & 0 deletions expected/gucs_1.out
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ min_val |
max_val |
boot_val | on
reset_val | on
-[ RECORD 2 ]-------------------------------------------------
name | percona_pg_telemetry.path
setting | /usr/local/percona/telemetry/pg
unit |
short_desc | Directory path for writing database info file(s)
min_val |
max_val |
boot_val | /usr/local/percona/telemetry/pg
reset_val | /usr/local/percona/telemetry/pg

\x
ALTER SYSTEM SET percona_pg_telemetry.enabled = false;
Expand Down
42 changes: 21 additions & 21 deletions percona_pg_telemetry.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ generate_filename(char *filename)
time(&currentTime);
pg_snprintf(f_name, MAXPGPATH, "%s-%lu-%ld.json", PT_FILENAME_BASE, system_id, currentTime);

join_path_components(filename, ptss->pg_telemetry_folder, f_name);
join_path_components(filename, ptss->telemetry_path, f_name);

return filename;
}
Expand Down Expand Up @@ -229,22 +229,22 @@ cleaup_telemetry_dir(void)
char json_file_id[MAXPGPATH];
int file_id_len;

validate_dir(ptss->pg_telemetry_folder);
validate_dir(ptss->telemetry_path);

d = AllocateDir(ptss->pg_telemetry_folder);
d = AllocateDir(ptss->telemetry_path);

if (d == NULL)
{
ereport(ERROR,
(errcode_for_file_access(),
errmsg("could not open percona telemetry directory \"%s\": %m",
ptss->pg_telemetry_folder)));
ptss->telemetry_path)));
}

pg_snprintf(json_file_id, sizeof(json_file_id), "%s-%lu", PT_FILENAME_BASE, system_id);
file_id_len = strlen(json_file_id);

while ((de = ReadDir(d, ptss->pg_telemetry_folder)) != NULL)
while ((de = ReadDir(d, ptss->telemetry_path)) != NULL)
{
if (strncmp(json_file_id, de->d_name, file_id_len) == 0)
{
Expand All @@ -256,7 +256,7 @@ cleaup_telemetry_dir(void)
}

/*
* pg_telemetry_folder
* telemetry_path
*/
bool
validate_dir(char *folder_path)
Expand All @@ -274,7 +274,7 @@ validate_dir(char *folder_path)
{
ereport(LOG,
(errcode_for_file_access(),
errmsg("percona_pg_telemetry.pg_telemetry_folder \"%s\" is not set to a writeable folder or the folder does not exist.", folder_path)));
errmsg("percona_pg_telemetry.path \"%s\" is not set to a writeable folder or the folder does not exist.", folder_path)));

PT_WORKER_EXIT(PT_FILE_ERROR);
}
Expand Down Expand Up @@ -359,8 +359,8 @@ pt_shmem_init(void)
uint64 system_id = GetSystemIdentifier();

/* Set paths */
strncpy(ptss->pg_telemetry_folder, t_folder, MAXPGPATH);
pg_snprintf(ptss->dbtemp_filepath, MAXPGPATH, "%s/%s-%lu.temp", ptss->pg_telemetry_folder, PT_FILENAME_BASE, system_id);
strncpy(ptss->telemetry_path, t_folder, MAXPGPATH);
pg_snprintf(ptss->dbtemp_filepath, MAXPGPATH, "%s/%s-%lu.temp", ptss->telemetry_path, PT_FILENAME_BASE, system_id);

/* Let's be optimistic here. No error code and no file currently being written. */
ptss->error_code = PT_SUCCESS;
Expand Down Expand Up @@ -396,21 +396,21 @@ init_guc(void)
NULL,
NULL);

/* telemetry files path */
DefineCustomStringVariable("percona_pg_telemetry.path",
"Directory path for writing database info file(s)",
NULL,
&t_folder,
PT_DEFAULT_FOLDER_PATH,
PGC_SIGHUP,
0,
NULL,
NULL,
NULL);

env = getenv("PT_DEBUG");
if (env != NULL)
{
/* file path */
DefineCustomStringVariable("percona_pg_telemetry.pg_telemetry_folder",
"Directory path for writing database info file(s)",
NULL,
&t_folder,
PT_DEFAULT_FOLDER_PATH,
PGC_SIGHUP,
0,
NULL,
NULL,
NULL);

/* scan time interval for the main launch process */
DefineCustomIntVariable("percona_pg_telemetry.scrape_interval",
"Data scrape interval",
Expand Down
2 changes: 1 addition & 1 deletion percona_pg_telemetry.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
shared_preload_libraries = 'percona_pg_telemetry'
percona_pg_telemetry.pg_telemetry_folder = '.'
percona_pg_telemetry.path = '.'
percona_pg_telemetry.scrape_interval = 1
2 changes: 1 addition & 1 deletion percona_pg_telemetry.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ typedef struct PTSharedState
bool write_in_progress;
TimestampTz last_file_processed;
int curr_file_index;
char pg_telemetry_folder[MAXPGPATH];
char telemetry_path[MAXPGPATH];
char dbtemp_filepath[MAXPGPATH];
char telemetry_filenames[FLEXIBLE_ARRAY_MEMBER][MAXPGPATH];
} PTSharedState;
Expand Down
4 changes: 2 additions & 2 deletions sql/debug_json.sql
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ HAVING COUNT(*) = (
)
AS INTEGER
)
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name like '%pg_telemetry_folder') AS INTEGER)
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name = 'percona_pg_telemetry.path') AS INTEGER)
);
-- Databases count will fail if you have any preexisting databases other than the standard template1 and postgres

Expand All @@ -59,7 +59,7 @@ FROM pg_database
WHERE datallowconn = true
HAVING COUNT(*) = (
SELECT json_array_length(read_json_file()::JSON->'databases')
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name like '%pg_telemetry_folder') AS INTEGER)
+ CAST(NOT EXISTS (SELECT * FROM pg_settings where name = 'percona_pg_telemetry.path') AS INTEGER)
);
-- Databases count will fail if you have any preexisting databases other than the standard template1 and postgres

Expand Down

0 comments on commit 04043fb

Please sign in to comment.