Skip to content

Commit

Permalink
[pgmoneta#187] Parse .history and expose to prometheus
Browse files Browse the repository at this point in the history
  • Loading branch information
Jubilee101 committed Mar 2, 2024
1 parent 8b9ff6d commit 5cf33f2
Show file tree
Hide file tree
Showing 10 changed files with 346 additions and 6 deletions.
2 changes: 2 additions & 0 deletions src/include/pgmoneta.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ extern "C" {
#include <ev.h>
#include <stdatomic.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#if HAVE_OPENBSD
Expand Down Expand Up @@ -211,6 +212,7 @@ struct server
int version; /**< The major version of the server*/
int operation_count; /**< Operation count of the server */
int failed_operation_count; /**< Failed operation count of the server */
uint32_t cur_timeline; /**< Current timeline the server is on*/
char last_operation_time[MISC_LENGTH]; /**< Last operation time of the server */
char last_failed_operation_time[MISC_LENGTH]; /**< Last failed operation time of the server */
char wal_shipping[MAX_PATH]; /**< The WAL shipping directory */
Expand Down
26 changes: 26 additions & 0 deletions src/include/wal.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,17 @@ extern "C" {
#endif

#include <ev.h>
#include <stdint.h>
#include <stdlib.h>

struct timeline_history
{
uint32_t parent_tli; /**< the previous timeline current timeline switched off from */
uint32_t switchpos_hi; /**< the high 32 bit in decimal of xlog pos where the switch happened */
uint32_t switchpos_lo; /**< the low 32 bit in decimal of xlog pos where the switch happened */
struct timeline_history* next; /**< the next history entry */
};

/**
* Receive WAL
* @param srv The server index
Expand All @@ -44,6 +53,23 @@ extern "C" {
void
pgmoneta_wal(int srv, char** argv);

/**
* Find and extract the history info from .history file of given server and timeline
* @param srv The server index
* @param tli The timeline
* @param history [out] the history info
* @return 0 on success, otherwise 1
*/
int
pgmoneta_get_timeline_history(int srv, uint32_t tli, struct timeline_history** history);

/**
* Free the history
* @param history The history
*/
void
pgmoneta_free_timeline_history(struct timeline_history* history);

#ifdef __cplusplus
}
#endif
Expand Down
3 changes: 2 additions & 1 deletion src/libpgmoneta/bzip2_compression.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ pgmoneta_bzip2_wal(char* directory)
if (entry->d_type == DT_REG)
{
if (pgmoneta_is_file_archive(entry->d_name) ||
pgmoneta_ends_with(entry->d_name, ".partial"))
pgmoneta_ends_with(entry->d_name, ".partial") ||
pgmoneta_ends_with(entry->d_name, ".history"))
{
continue;
}
Expand Down
1 change: 1 addition & 0 deletions src/libpgmoneta/configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ pgmoneta_read_configuration(void* shm, char* filename)
atomic_init(&srv.wal, false);
srv.wal_streaming = false;
srv.valid = false;
srv.cur_timeline = 1; // by default current timeline is 1
memset(srv.wal_shipping, 0, MAX_PATH);

idx_server++;
Expand Down
3 changes: 2 additions & 1 deletion src/libpgmoneta/gzip_compression.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,8 @@ pgmoneta_gzip_wal(char* directory)
if (entry->d_type == DT_REG)
{
if (pgmoneta_is_file_archive(entry->d_name) ||
pgmoneta_ends_with(entry->d_name, ".partial"))
pgmoneta_ends_with(entry->d_name, ".partial") ||
pgmoneta_ends_with(entry->d_name, ".history"))
{
continue;
}
Expand Down
3 changes: 2 additions & 1 deletion src/libpgmoneta/lz4_compression.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ pgmoneta_lz4c_wal(char* directory)
if (entry->d_type == DT_REG)
{
if (pgmoneta_is_file_archive(entry->d_name) ||
pgmoneta_ends_with(entry->d_name, ".partial"))
pgmoneta_ends_with(entry->d_name, ".partial") ||
pgmoneta_ends_with(entry->d_name, ".history"))
{
continue;
}
Expand Down
214 changes: 214 additions & 0 deletions src/libpgmoneta/prometheus.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <prometheus.h>
#include <shmem.h>
#include <utils.h>
#include <wal.h>

/* system */
#include <ev.h>
Expand Down Expand Up @@ -326,6 +327,62 @@ home_page(int client_fd)
data = pgmoneta_append(data, " <h2>pgmoneta_wal_shipping_total_space</h2>\n");
data = pgmoneta_append(data, " The total disk space for the WAL shipping directory of a server\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_server_timeline</h2>\n");
data = pgmoneta_append(data, " The current timeline a server is on\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>name</td>\n");
data = pgmoneta_append(data, " <td>The identifier for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_server_parent_tli</h2>\n");
data = pgmoneta_append(data, " The parent timeline of a timeline on a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>name</td>\n");
data = pgmoneta_append(data, " <td>The identifier for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>tli</td>\n");
data = pgmoneta_append(data, " <td>The current/previous timeline ID for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_server_timeline_switchpos_high32</h2>\n");
data = pgmoneta_append(data, " The high 32 bits in decimal of the switch position of a timeline on a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>name</td>\n");
data = pgmoneta_append(data, " <td>The identifier for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>tli</td>\n");
data = pgmoneta_append(data, " <td>The current/previous timeline ID for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_server_timeline_switchpos_low32</h2>\n");
data = pgmoneta_append(data, " The low 32 bits in decimal of the switch position of a timeline on a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
data = pgmoneta_append(data, " <tbody>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>name</td>\n");
data = pgmoneta_append(data, " <td>The identifier for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " <tr>\n");
data = pgmoneta_append(data, " <td>tli</td>\n");
data = pgmoneta_append(data, " <td>The current/previous timeline ID for the server</td>\n");
data = pgmoneta_append(data, " </tr>\n");
data = pgmoneta_append(data, " </tbody>\n");
data = pgmoneta_append(data, " </table>\n");
data = pgmoneta_append(data, " <p>\n");
data = pgmoneta_append(data, " <h2>pgmoneta_backup_oldest</h2>\n");
data = pgmoneta_append(data, " The oldest backup for a server\n");
data = pgmoneta_append(data, " <table border=\"1\">\n");
Expand Down Expand Up @@ -947,6 +1004,163 @@ general_information(int client_fd)
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_server_timeline The current timeline a server is on\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_server_timeline\n");
for (int i = 0; i < config->number_of_servers; i++)
{
data = pgmoneta_append(data, "pgmoneta_server_timeline{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_int(data, config->servers[i].cur_timeline);

data = pgmoneta_append(data, "\n");
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_server_parent_tli The parent timeline of a timeline on a server\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_server_parent_tli\n");
for (int i = 0; i < config->number_of_servers; i++)
{
struct timeline_history* history = NULL;
struct timeline_history* curh = NULL;
int tli = 2;

data = pgmoneta_append(data, "pgmoneta_server_parent_tli{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\", ");

data = pgmoneta_append(data, "tli=\"");
data = pgmoneta_append_int(data, 1);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_int(data, 0);

data = pgmoneta_append(data, "\n");

pgmoneta_get_timeline_history(i, config->servers[i].cur_timeline, &history);
curh = history;
while (curh != NULL)
{
data = pgmoneta_append(data, "pgmoneta_server_parent_tli{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\", ");

data = pgmoneta_append(data, "tli=\"");
data = pgmoneta_append_int(data, tli);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_int(data, curh->parent_tli);

data = pgmoneta_append(data, "\n");

curh = curh->next;
tli++;
}
pgmoneta_free_timeline_history(history);
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_server_timeline_switchpos_high32 The high 32 bits in decimal of the switch position of a timeline on a serverr\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_server_timeline_switchpos_high32\n");
for (int i = 0; i < config->number_of_servers; i++)
{
struct timeline_history* history = NULL;
struct timeline_history* curh = NULL;
int tli = 2;

data = pgmoneta_append(data, "pgmoneta_server_timeline_switchpos_high32{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\", ");

data = pgmoneta_append(data, "tli=\"");
data = pgmoneta_append_int(data, 1);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append(data, "0");

data = pgmoneta_append(data, "\n");

pgmoneta_get_timeline_history(i, config->servers[i].cur_timeline, &history);
curh = history;
while (curh != NULL)
{
data = pgmoneta_append(data, "pgmoneta_server_timeline_switchpos_high32{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\", ");

data = pgmoneta_append(data, "tli=\"");
data = pgmoneta_append_int(data, tli);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_ulong(data, curh->switchpos_hi);

data = pgmoneta_append(data, "\n");

curh = curh->next;
tli++;
}
pgmoneta_free_timeline_history(history);
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_server_timeline_switchpos_low32 The low 32 bits in decimal of the switch position of a timeline on a serverr\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_server_timeline_switchpos_low32\n");
for (int i = 0; i < config->number_of_servers; i++)
{
struct timeline_history* history = NULL;
struct timeline_history* curh = NULL;
int tli = 2;

data = pgmoneta_append(data, "pgmoneta_server_timeline_switchpos_low32{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\", ");

data = pgmoneta_append(data, "tli=\"");
data = pgmoneta_append_int(data, 1);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append(data, "0");

data = pgmoneta_append(data, "\n");

pgmoneta_get_timeline_history(i, config->servers[i].cur_timeline, &history);
curh = history;
while (curh != NULL)
{
data = pgmoneta_append(data, "pgmoneta_server_timeline_switchpos_low32{");

data = pgmoneta_append(data, "name=\"");
data = pgmoneta_append(data, config->servers[i].name);
data = pgmoneta_append(data, "\", ");

data = pgmoneta_append(data, "tli=\"");
data = pgmoneta_append_int(data, tli);
data = pgmoneta_append(data, "\"} ");

data = pgmoneta_append_ulong(data, curh->switchpos_lo);

data = pgmoneta_append(data, "\n");

curh = curh->next;
tli++;
}
pgmoneta_free_timeline_history(history);
}
data = pgmoneta_append(data, "\n");

data = pgmoneta_append(data, "#HELP pgmoneta_server_valid Is the server in a valid state\n");
data = pgmoneta_append(data, "#TYPE pgmoneta_server_valid gauge\n");
for (int i = 0; i < config->number_of_servers; i++)
Expand Down

0 comments on commit 5cf33f2

Please sign in to comment.