This is an automated email from the ASF dual-hosted git repository.

moonchen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 7766ce2cc9 TLS: count handshake signatures by key type (#13289)
7766ce2cc9 is described below

commit 7766ce2cc9a8e58a247201d6a3ce7b1d3e895a59
Author: Mo Chen <[email protected]>
AuthorDate: Fri Jun 19 17:45:42 2026 -0500

    TLS: count handshake signatures by key type (#13289)
    
    A full TLS handshake runs an asymmetric signature whose cost depends on the
    server key type -- RSA being far heavier than ECDSA.  Count those signatures
    by key type to make that work visible; resumed handshakes skip the 
signature.
    
    Also add proxy.process.ssl.connections_closed, incremented once per 
SSL_free,
    to track TLS connection teardown volume.
    
    New counters:
      * proxy.process.ssl.handshake_sign_rsa / _ecdsa / _other
      * proxy.process.ssl.connections_closed
---
 src/iocore/net/SSLNetVConnection.cc |  6 ++++++
 src/iocore/net/SSLStats.cc          |  4 ++++
 src/iocore/net/SSLStats.h           |  4 ++++
 src/iocore/net/TLSBasicSupport.cc   | 22 ++++++++++++++++++++++
 4 files changed, 36 insertions(+)

diff --git a/src/iocore/net/SSLNetVConnection.cc 
b/src/iocore/net/SSLNetVConnection.cc
index 95b7e57f11..22702e81fd 100644
--- a/src/iocore/net/SSLNetVConnection.cc
+++ b/src/iocore/net/SSLNetVConnection.cc
@@ -991,6 +991,12 @@ SSLNetVConnection::clear()
   client_sess.reset();
 
   if (ssl != nullptr) {
+    // clear() runs from free() once per VC recycle, so this is the single 
chokepoint where a TLS
+    // connection's SSL object is torn down -- count it as one connection 
close here. Blind-tunnel
+    // conversions free their SSL earlier (before any data) and continue as a 
tunnel rather than a
+    // close, so by here ssl is already null for them and they are not counted 
(they are tracked by
+    // the tunnel metrics instead).
+    Metrics::Counter::increment(ssl_rsb.connections_closed);
     SSL_free(ssl);
     ssl = nullptr;
   }
diff --git a/src/iocore/net/SSLStats.cc b/src/iocore/net/SSLStats.cc
index 11d82d2b24..06d22883be 100644
--- a/src/iocore/net/SSLStats.cc
+++ b/src/iocore/net/SSLStats.cc
@@ -223,6 +223,10 @@ SSLInitializeStatistics()
   ssl_rsb.total_sslv3                        = 
Metrics::Counter::createPtr("proxy.process.ssl.ssl_total_sslv3");
   ssl_rsb.total_success_handshake_count_in   = 
Metrics::Counter::createPtr("proxy.process.ssl.total_success_handshake_count_in");
   ssl_rsb.total_success_handshake_count_out  = 
Metrics::Counter::createPtr("proxy.process.ssl.total_success_handshake_count_out");
+  ssl_rsb.handshake_sign_rsa                 = 
Metrics::Counter::createPtr("proxy.process.ssl.handshake_sign_rsa");
+  ssl_rsb.handshake_sign_ecdsa               = 
Metrics::Counter::createPtr("proxy.process.ssl.handshake_sign_ecdsa");
+  ssl_rsb.handshake_sign_other               = 
Metrics::Counter::createPtr("proxy.process.ssl.handshake_sign_other");
+  ssl_rsb.connections_closed                 = 
Metrics::Counter::createPtr("proxy.process.ssl.connections_closed");
   ssl_rsb.total_ticket_keys_renewed          = 
Metrics::Counter::createPtr("proxy.process.ssl.total_ticket_keys_renewed");
   ssl_rsb.total_tickets_created              = 
Metrics::Counter::createPtr("proxy.process.ssl.total_tickets_created");
   ssl_rsb.total_tickets_not_found            = 
Metrics::Counter::createPtr("proxy.process.ssl.total_tickets_not_found");
diff --git a/src/iocore/net/SSLStats.h b/src/iocore/net/SSLStats.h
index bd4def54eb..76324dff72 100644
--- a/src/iocore/net/SSLStats.h
+++ b/src/iocore/net/SSLStats.h
@@ -85,6 +85,10 @@ struct SSLStatsBlock {
   Metrics::Counter::AtomicType *total_sslv3                                    
= nullptr;
   Metrics::Counter::AtomicType *total_success_handshake_count_in               
= nullptr;
   Metrics::Counter::AtomicType *total_success_handshake_count_out              
= nullptr;
+  Metrics::Counter::AtomicType *handshake_sign_rsa                             
= nullptr;
+  Metrics::Counter::AtomicType *handshake_sign_ecdsa                           
= nullptr;
+  Metrics::Counter::AtomicType *handshake_sign_other                           
= nullptr;
+  Metrics::Counter::AtomicType *connections_closed                             
= nullptr;
   Metrics::Counter::AtomicType *total_ticket_keys_renewed                      
= nullptr;
   Metrics::Counter::AtomicType *total_tickets_created                          
= nullptr;
   Metrics::Counter::AtomicType *total_tickets_not_found                        
= nullptr;
diff --git a/src/iocore/net/TLSBasicSupport.cc 
b/src/iocore/net/TLSBasicSupport.cc
index 5d7187da4a..897e406741 100644
--- a/src/iocore/net/TLSBasicSupport.cc
+++ b/src/iocore/net/TLSBasicSupport.cc
@@ -319,6 +319,28 @@ TLSBasicSupport::_update_end_of_handshake_stats()
 {
   Metrics::Counter::increment(ssl_rsb.total_success_handshake_count_in);
 
+  // Only a full handshake runs the asymmetric signature (a resumed one skips 
it); count those
+  // signatures by the server private-key type.
+  {
+    const SSL *ssl = this->_get_ssl_object();
+    if (ssl != nullptr && !SSL_session_reused(ssl)) {
+      if (EVP_PKEY *pkey = SSL_get_privatekey(ssl); pkey != nullptr) {
+        switch (EVP_PKEY_id(pkey)) {
+        case EVP_PKEY_RSA:
+        case EVP_PKEY_RSA_PSS:
+          Metrics::Counter::increment(ssl_rsb.handshake_sign_rsa);
+          break;
+        case EVP_PKEY_EC:
+          Metrics::Counter::increment(ssl_rsb.handshake_sign_ecdsa);
+          break;
+        default:
+          Metrics::Counter::increment(ssl_rsb.handshake_sign_other);
+          break;
+        }
+      }
+    }
+  }
+
 #if defined(OPENSSL_IS_BORINGSSL)
   SSL     *ssl      = this->_get_ssl_object();
   uint16_t group_id = SSL_get_group_id(ssl);

Reply via email to