mirror of
https://git.jabber.space/devs/cproof.git
synced 2026-07-24 06:06:21 +00:00
feat(xmpp): add comprehensive connection debug logging
Add detailed debug output tracking connection lifecycle, autoping events, and session state transitions with timestamps and counters. - Track connection attempts, successes, disconnects, and reconnects - Log autoping timer events, responses, and timeouts - Record session login, logout, and reconnection attempts - Add elapsed time calculations since key events - Use [CONNDBG] tag for easy log filtering Files: connection.c, iq.c, session.c, connection.h
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "profanity.h"
|
||||
#include "log.h"
|
||||
@@ -95,6 +96,72 @@ static GTimer* reconnect_timer;
|
||||
static activity_state_t activity_state;
|
||||
static resource_presence_t saved_presence;
|
||||
static char* saved_status;
|
||||
static unsigned long session_reconnect_attempt_counter = 0; // extended debug counter
|
||||
|
||||
static void
|
||||
_session_get_debug_stats(time_t* now_out, char* elapsed_success, size_t success_len, char* elapsed_disconnect, size_t disconnect_len)
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
time_t last_success = connection_last_successful_connect_ts();
|
||||
time_t last_disc = connection_last_disconnect_ts();
|
||||
|
||||
if (now_out) *now_out = now;
|
||||
_connection_format_elapsed_time(last_success, now, elapsed_success, success_len);
|
||||
_connection_format_elapsed_time(last_disc, now, elapsed_disconnect, disconnect_len);
|
||||
}
|
||||
|
||||
// Helper function to log connection debug info
|
||||
static void
|
||||
_session_log_connect_debug(const char* event, const char* account, const char* jid,
|
||||
const char* server, int port, const char* tls_policy, const char* auth_policy)
|
||||
{
|
||||
time_t now;
|
||||
char elapsed_success[32];
|
||||
char elapsed_disconnect[32];
|
||||
_session_get_debug_stats(&now, elapsed_success, sizeof(elapsed_success), elapsed_disconnect, sizeof(elapsed_disconnect));
|
||||
|
||||
log_debug("[CONNDBG] %s ts=%ld account=%s jid=%s server=%s port=%d tls_policy=%s auth_policy=%s elapsed-since-success=%s elapsed-since-disconnect=%s total-attempts=%lu total-success=%lu",
|
||||
event, (long)now, account ? account : "(none)", jid ? jid : "(none)",
|
||||
server ? server : "(default)", port,
|
||||
tls_policy ? tls_policy : "(default)",
|
||||
auth_policy ? auth_policy : "(default)",
|
||||
elapsed_success, elapsed_disconnect,
|
||||
connection_connect_attempts(), connection_successful_connects());
|
||||
}
|
||||
|
||||
// Helper function to log session state debug info
|
||||
static void
|
||||
_session_log_state_debug(const char* event, int extra_param)
|
||||
{
|
||||
time_t now;
|
||||
char elapsed_success[32];
|
||||
char elapsed_disconnect[32];
|
||||
_session_get_debug_stats(&now, elapsed_success, sizeof(elapsed_success), elapsed_disconnect, sizeof(elapsed_disconnect));
|
||||
|
||||
log_debug("[CONNDBG] %s ts=%ld param=%d account=%s elapsed-since-success=%s elapsed-since-disconnect=%s total-attempts=%lu total-success=%lu session-reconnects=%lu",
|
||||
event, (long)now, extra_param,
|
||||
saved_account.name ? saved_account.name : "(none)",
|
||||
elapsed_success, elapsed_disconnect,
|
||||
connection_connect_attempts(), connection_successful_connects(),
|
||||
session_reconnect_attempt_counter);
|
||||
}
|
||||
|
||||
// Helper function to log reconnect attempt
|
||||
static void
|
||||
_session_log_reconnect_debug(unsigned long attempt_num, const char* account, const char* jid,
|
||||
const char* server, unsigned short port, const char* tls_policy, const char* auth_policy)
|
||||
{
|
||||
time_t now;
|
||||
char elapsed_success[32];
|
||||
char elapsed_disconnect[32];
|
||||
_session_get_debug_stats(&now, elapsed_success, sizeof(elapsed_success), elapsed_disconnect, sizeof(elapsed_disconnect));
|
||||
|
||||
log_debug("[CONNDBG] RECONNECT_ATTEMPT #%lu ts=%ld account=%s jid=%s server=%s port=%u tls_policy=%s auth_policy=%s elapsed-since-success=%s elapsed-since-disconnect=%s total-connect-attempts=%lu total-success=%lu global-reconnects=%lu",
|
||||
attempt_num, (long)now, account, jid, server ? server : "(null)", port,
|
||||
tls_policy ? tls_policy : "(default)", auth_policy ? auth_policy : "(default)",
|
||||
elapsed_success, elapsed_disconnect,
|
||||
connection_connect_attempts(), connection_successful_connects(), connection_reconnect_counter());
|
||||
}
|
||||
|
||||
static void _session_free_internals(void);
|
||||
static void _session_free_saved_details(void);
|
||||
@@ -133,6 +200,8 @@ session_connect_with_account(const ProfAccount* const account)
|
||||
assert(account != NULL);
|
||||
|
||||
log_info("Connecting using account: %s", account->name);
|
||||
_session_log_connect_debug("SESSION_CONNECT_WITH_ACCOUNT", account->name, account->jid,
|
||||
account->server, account->port, account->tls_policy, account->auth_policy);
|
||||
|
||||
_session_free_internals();
|
||||
|
||||
@@ -166,6 +235,9 @@ session_connect_with_details(const char* const jid, const char* const passwd, co
|
||||
assert(jid != NULL);
|
||||
assert(passwd != NULL);
|
||||
|
||||
_session_log_connect_debug("SESSION_CONNECT_WITH_DETAILS", NULL, jid,
|
||||
altdomain, port, tls_policy, auth_policy);
|
||||
|
||||
_session_free_internals();
|
||||
|
||||
// save details for reconnect, remember name for account creating on success
|
||||
@@ -218,12 +290,17 @@ session_connect_with_details(const char* const jid, const char* const passwd, co
|
||||
void
|
||||
session_autoping_fail(void)
|
||||
{
|
||||
int autoping_timeout = prefs_get_autoping_timeout();
|
||||
_session_log_state_debug("SESSION_AUTOPING_FAIL", autoping_timeout);
|
||||
session_lost_connection();
|
||||
}
|
||||
|
||||
void
|
||||
session_disconnect(void)
|
||||
{
|
||||
jabber_conn_status_t conn_status = connection_get_status();
|
||||
_session_log_state_debug("SESSION_DISCONNECT", (int)conn_status);
|
||||
|
||||
// if connected, send end stream and wait for response
|
||||
if (connection_get_status() == JABBER_CONNECTED) {
|
||||
log_info("Closing connection");
|
||||
@@ -319,6 +396,8 @@ _receive_mood(xmpp_stanza_t* const stanza, void* const userdata)
|
||||
void
|
||||
session_login_success(gboolean secured)
|
||||
{
|
||||
_session_log_state_debug("SESSION_LOGIN_SUCCESS", secured);
|
||||
|
||||
chat_sessions_init();
|
||||
|
||||
message_handlers_init();
|
||||
@@ -370,6 +449,8 @@ session_login_success(gboolean secured)
|
||||
void
|
||||
session_login_failed(void)
|
||||
{
|
||||
_session_log_state_debug("SESSION_LOGIN_FAILED", reconnect_timer != NULL);
|
||||
|
||||
if (reconnect_timer == NULL) {
|
||||
log_debug("Connection handler: No reconnect timer");
|
||||
sv_ev_failed_login();
|
||||
@@ -389,12 +470,17 @@ session_login_failed(void)
|
||||
void
|
||||
session_lost_connection(void)
|
||||
{
|
||||
int reconnect_sec = prefs_get_reconnect();
|
||||
_session_log_state_debug("SESSION_LOST_CONNECTION", reconnect_sec);
|
||||
|
||||
/* this callback also clears all cached data */
|
||||
sv_ev_lost_connection();
|
||||
if (prefs_get_reconnect() != 0) {
|
||||
assert(reconnect_timer == NULL);
|
||||
reconnect_timer = g_timer_new();
|
||||
log_debug("[CONNDBG] created reconnect timer, will reconnect in %d seconds", reconnect_sec);
|
||||
} else {
|
||||
log_debug("[CONNDBG] reconnect disabled, freeing session internals");
|
||||
_session_free_internals();
|
||||
}
|
||||
}
|
||||
@@ -574,6 +660,10 @@ session_reconnect_now(void)
|
||||
port = account->port;
|
||||
}
|
||||
|
||||
session_reconnect_attempt_counter++;
|
||||
_session_log_reconnect_debug(session_reconnect_attempt_counter, account->name, jid,
|
||||
server, port, account->tls_policy, account->auth_policy);
|
||||
|
||||
log_debug("Attempting reconnect with account %s", account->name);
|
||||
connection_connect(jid, saved_account.passwd, server, port, account->tls_policy, account->auth_policy);
|
||||
account_free(account);
|
||||
|
||||
Reference in New Issue
Block a user