blob: 41dca936b0ffa7d74a1c4589ba5fdfd97cdeb9c9 [file]
/** @file
Stats of TLS
@section license License
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#include "tscore/ink_config.h"
#include "tsutil/Metrics.h"
#include <openssl/ssl.h>
#include <unordered_map>
using ts::Metrics;
// For some odd reason, these have to be initialized with nullptr, because the order
// of initialization and how we load certs is weird... In reality only the metric
// for ssl_rsb.total_ticket_keys_renewed needs this initialization, but lets be
// consistent at least.
struct SSLStatsBlock {
Metrics::Counter::AtomicType *cert_compress_zlib = nullptr;
Metrics::Counter::AtomicType *cert_compress_zlib_failure = nullptr;
Metrics::Counter::AtomicType *cert_compress_cache_hit = nullptr;
Metrics::Counter::AtomicType *cert_decompress_zlib = nullptr;
Metrics::Counter::AtomicType *cert_decompress_zlib_failure = nullptr;
Metrics::Counter::AtomicType *cert_compress_brotli = nullptr;
Metrics::Counter::AtomicType *cert_compress_brotli_failure = nullptr;
Metrics::Counter::AtomicType *cert_decompress_brotli = nullptr;
Metrics::Counter::AtomicType *cert_decompress_brotli_failure = nullptr;
Metrics::Counter::AtomicType *cert_compress_zstd = nullptr;
Metrics::Counter::AtomicType *cert_compress_zstd_failure = nullptr;
Metrics::Counter::AtomicType *cert_decompress_zstd = nullptr;
Metrics::Counter::AtomicType *cert_decompress_zstd_failure = nullptr;
Metrics::Counter::AtomicType *early_data_received_count = nullptr;
Metrics::Counter::AtomicType *error_async = nullptr;
Metrics::Counter::AtomicType *error_ssl = nullptr;
Metrics::Counter::AtomicType *error_syscall = nullptr;
Metrics::Counter::AtomicType *ocsp_refresh_cert_failure = nullptr;
Metrics::Counter::AtomicType *ocsp_refreshed_cert = nullptr;
Metrics::Counter::AtomicType *ocsp_revoked_cert = nullptr;
Metrics::Counter::AtomicType *ocsp_unknown_cert = nullptr;
Metrics::Counter::AtomicType *origin_server_bad_cert = nullptr;
Metrics::Counter::AtomicType *origin_server_cert_verify_failed = nullptr;
Metrics::Counter::AtomicType *origin_server_decryption_failed = nullptr;
Metrics::Counter::AtomicType *origin_server_expired_cert = nullptr;
Metrics::Counter::AtomicType *origin_server_other_errors = nullptr;
Metrics::Counter::AtomicType *origin_server_revoked_cert = nullptr;
Metrics::Counter::AtomicType *origin_server_unknown_ca = nullptr;
Metrics::Counter::AtomicType *origin_server_unknown_cert = nullptr;
Metrics::Counter::AtomicType *origin_server_wrong_version = nullptr;
Metrics::Counter::AtomicType *origin_session_cache_hit = nullptr;
Metrics::Counter::AtomicType *origin_session_cache_miss = nullptr;
Metrics::Counter::AtomicType *origin_session_cache_timeout = nullptr;
Metrics::Counter::AtomicType *origin_session_reused_count = nullptr;
Metrics::Counter::AtomicType *session_cache_eviction = nullptr;
Metrics::Counter::AtomicType *session_cache_hit = nullptr;
Metrics::Counter::AtomicType *session_cache_lock_contention = nullptr;
Metrics::Counter::AtomicType *session_cache_miss = nullptr;
Metrics::Counter::AtomicType *session_cache_new_session = nullptr;
Metrics::Counter::AtomicType *sni_name_set_failure = nullptr;
Metrics::Counter::AtomicType *total_attempts_handshake_count_in = nullptr;
Metrics::Counter::AtomicType *total_attempts_handshake_count_out = nullptr;
Metrics::Counter::AtomicType *total_dyn_def_tls_record_count = nullptr;
Metrics::Counter::AtomicType *total_dyn_max_tls_record_count = nullptr;
Metrics::Counter::AtomicType *total_dyn_redo_tls_record_count = nullptr;
Metrics::Counter::AtomicType *total_handshake_time = nullptr;
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;
Metrics::Counter::AtomicType *total_tickets_no_certificate = nullptr;
Metrics::Counter::AtomicType *total_tickets_renewed = nullptr;
Metrics::Counter::AtomicType *total_tickets_verified_old_key = nullptr;
Metrics::Counter::AtomicType *total_tickets_verified = nullptr;
Metrics::Counter::AtomicType *total_tlsv1 = nullptr;
Metrics::Counter::AtomicType *total_tlsv11 = nullptr;
Metrics::Counter::AtomicType *total_tlsv12 = nullptr;
Metrics::Counter::AtomicType *total_tlsv13 = nullptr;
Metrics::Counter::AtomicType *user_agent_bad_cert = nullptr;
Metrics::Counter::AtomicType *user_agent_cert_verify_failed = nullptr;
Metrics::Counter::AtomicType *user_agent_decryption_failed = nullptr;
Metrics::Counter::AtomicType *user_agent_decryption_failed_or_bad_record_mac = nullptr;
Metrics::Counter::AtomicType *user_agent_expired_cert = nullptr;
Metrics::Counter::AtomicType *user_agent_http_request = nullptr;
Metrics::Counter::AtomicType *user_agent_inappropriate_fallback = nullptr;
Metrics::Counter::AtomicType *user_agent_no_shared_cipher = nullptr;
Metrics::Counter::AtomicType *user_agent_other_errors = nullptr;
Metrics::Counter::AtomicType *user_agent_revoked_cert = nullptr;
Metrics::Counter::AtomicType *user_agent_unknown_ca = nullptr;
Metrics::Counter::AtomicType *user_agent_unknown_cert = nullptr;
Metrics::Counter::AtomicType *user_agent_version_too_high = nullptr;
Metrics::Counter::AtomicType *user_agent_version_too_low = nullptr;
Metrics::Counter::AtomicType *user_agent_wrong_version = nullptr;
Metrics::Counter::AtomicType *tls_handshake_bytes_in_total = nullptr;
Metrics::Counter::AtomicType *tls_handshake_bytes_out_total = nullptr;
// Note: The following user_agent_session_* metrics are implemented as Gauge
// types even though they semantically represent cumulative counters. This is
// because they are periodically synchronized from external counter sources
// (OpenSSL's built-in session cache) and need to be "set" to specific values
// rather than incremented. From a monitoring perspective, these should be
// treated as counters for calculating rates.
Metrics::Gauge::AtomicType *user_agent_session_hit = nullptr;
Metrics::Gauge::AtomicType *user_agent_session_miss = nullptr;
Metrics::Gauge::AtomicType *user_agent_session_timeout = nullptr;
Metrics::Gauge::AtomicType *user_agent_sessions = nullptr;
Metrics::Counter::AtomicType *ssl_multicert_load_failures =
nullptr; ///< Incremented per cert that fails to load during ssl_multicert reload.
};
extern SSLStatsBlock ssl_rsb;
extern std::unordered_map<std::string, Metrics::Counter::AtomicType *> cipher_map;
#if defined(OPENSSL_IS_BORINGSSL) || HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS
extern std::unordered_map<std::string, Metrics::Counter::AtomicType *> tls_group_map;
extern std::unordered_map<std::string, Metrics::Counter::AtomicType *> tls_group_handshake_time_map;
#elif HAVE_SSL_GET_NEGOTIATED_GROUP
extern std::unordered_map<int, Metrics::Counter::AtomicType *> tls_group_map;
extern std::unordered_map<int, Metrics::Counter::AtomicType *> tls_group_handshake_time_map;
constexpr int SSL_GROUP_STAT_OTHER_KEY = 0;
#endif
// Initialize SSL statistics.
// Must be called AFTER SSLCertificateConfig::startup() so SSL contexts are loaded.
void SSLInitializeStatistics();
const std::string SSL_CIPHER_STAT_OTHER = "OTHER";