feat: 把 A 端的 Session/KCP/视频/控制 都收口到一个本地 daemon 进程里,Django 和输入发送端都改成通过本机 UDS HTTP 去访问它,同时补齐了观测、性能和可用性上的几个关键问题。
This commit is contained in:
@@ -294,6 +294,14 @@ int kcp_client_persist_message(kcp_client_t *client, const message_t *msg, const
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kcp_client_metrics_snapshot(kcp_client_t *client, kcp_conn_metrics_t *out_metrics) {
|
||||
if (client == NULL || out_metrics == NULL) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
return kcp_conn_metrics_snapshot(client->conn, out_metrics);
|
||||
}
|
||||
|
||||
int kcp_client_close(kcp_client_t *client) {
|
||||
return client == NULL ? 0 : kcp_conn_close(client->conn);
|
||||
}
|
||||
|
||||
@@ -1788,6 +1788,83 @@ int kcp_conn_local_addr(const kcp_conn_t *conn, struct sockaddr_storage *addr, s
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kcp_conn_metrics_snapshot(kcp_conn_t *conn, kcp_conn_metrics_t *out_metrics) {
|
||||
struct sockaddr_storage local_addr;
|
||||
socklen_t local_len = sizeof(local_addr);
|
||||
|
||||
if (conn == NULL || out_metrics == NULL) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(out_metrics, 0, sizeof(*out_metrics));
|
||||
out_metrics->connected = !atomic_load(&conn->closed);
|
||||
|
||||
if (conn->sock_state != NULL && !conn->socket_closed &&
|
||||
getsockname(conn->sock_state->fd, (struct sockaddr *) &local_addr, &local_len) == 0) {
|
||||
omni_sockaddr_to_string(
|
||||
(const struct sockaddr *) &local_addr,
|
||||
local_len,
|
||||
out_metrics->local_addr,
|
||||
sizeof(out_metrics->local_addr)
|
||||
);
|
||||
}
|
||||
if (conn->remote_addr_len > 0) {
|
||||
omni_sockaddr_to_string(
|
||||
(const struct sockaddr *) &conn->remote_addr,
|
||||
conn->remote_addr_len,
|
||||
out_metrics->remote_addr,
|
||||
sizeof(out_metrics->remote_addr)
|
||||
);
|
||||
}
|
||||
|
||||
if (conn->process_sampler != NULL) {
|
||||
out_metrics->bytes_sent = atomic_load_explicit(&conn->process_sampler->bytes_sent, memory_order_relaxed);
|
||||
out_metrics->bytes_received = atomic_load_explicit(&conn->process_sampler->bytes_received, memory_order_relaxed);
|
||||
out_metrics->in_pkts = atomic_load_explicit(&conn->process_sampler->in_pkts, memory_order_relaxed);
|
||||
out_metrics->out_pkts = atomic_load_explicit(&conn->process_sampler->out_pkts, memory_order_relaxed);
|
||||
out_metrics->in_segs = atomic_load_explicit(&conn->process_sampler->in_segs, memory_order_relaxed);
|
||||
out_metrics->out_segs = atomic_load_explicit(&conn->process_sampler->out_segs, memory_order_relaxed);
|
||||
out_metrics->in_errs = atomic_load_explicit(&conn->process_sampler->in_errs, memory_order_relaxed);
|
||||
out_metrics->kcp_in_errs = atomic_load_explicit(&conn->process_sampler->kcp_in_errs, memory_order_relaxed);
|
||||
} else {
|
||||
out_metrics->bytes_sent = conn->pending_bytes_sent;
|
||||
out_metrics->bytes_received = conn->pending_bytes_received;
|
||||
out_metrics->in_pkts = conn->pending_in_pkts;
|
||||
out_metrics->out_pkts = conn->pending_out_pkts;
|
||||
out_metrics->in_segs = conn->pending_in_segs;
|
||||
out_metrics->out_segs = conn->pending_out_segs;
|
||||
out_metrics->in_errs = conn->pending_in_errs;
|
||||
out_metrics->kcp_in_errs = conn->pending_kcp_in_errs;
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&conn->kcp_mu);
|
||||
if (conn->kcp != NULL) {
|
||||
out_metrics->has_conv = 1;
|
||||
out_metrics->conv = conn->kcp->conv;
|
||||
out_metrics->rto_ms = conn->kcp->rx_rto;
|
||||
out_metrics->srtt_ms = conn->kcp->rx_srtt;
|
||||
out_metrics->srttvar_ms = conn->kcp->rx_rttval;
|
||||
out_metrics->ring_buffer_snd_queue = conn->kcp->nsnd_que;
|
||||
out_metrics->ring_buffer_rcv_queue = conn->kcp->nrcv_que;
|
||||
out_metrics->ring_buffer_snd_buffer = conn->kcp->nsnd_buf;
|
||||
out_metrics->fast_retrans_segs = conn->kcp->fast_retrans_xmit;
|
||||
/* This KCP fork does not implement early retransmit, so the counter stays zero. */
|
||||
out_metrics->early_retrans_segs = conn->kcp->early_retrans_xmit;
|
||||
out_metrics->lost_segs = conn->kcp->lost_xmit;
|
||||
out_metrics->repeat_segs = conn->kcp->repeat_xmit;
|
||||
out_metrics->retrans_segs =
|
||||
out_metrics->fast_retrans_segs +
|
||||
out_metrics->early_retrans_segs +
|
||||
out_metrics->lost_segs;
|
||||
} else {
|
||||
out_metrics->connected = 0;
|
||||
}
|
||||
pthread_mutex_unlock(&conn->kcp_mu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kcp_conn_close(kcp_conn_t *conn) {
|
||||
if (conn == NULL) {
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user