Skip to content

Commit 4589e90

Browse files
authored
add virtual builtins stats (#1369)
1 parent 8146046 commit 4589e90

8 files changed

Lines changed: 58 additions & 25 deletions

File tree

runtime/interface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2297,9 +2297,9 @@ static void init_interface_lib() {
22972297

22982298
static void init_runtime_libs() {
22992299
// init_curl_lib() lazy called in runtime
2300-
runtime_builtins_stats::init_request_stats();
23012300
init_instance_cache_lib();
23022301
init_confdata_functions_lib();
2302+
runtime_builtins_stats::init_request_stats();
23032303

23042304
init_memcache_lib();
23052305
init_mysql_lib();

runtime/openssl.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "runtime/datetime/datetime_functions.h"
3838
#include "runtime/files.h"
3939
#include "runtime/net_events.h"
40+
#include "runtime/runtime-builtin-stats.h"
4041
#include "runtime/streams.h"
4142
#include "runtime/string_functions.h"
4243
#include "runtime/url.h"
@@ -1737,11 +1738,23 @@ void openssl_add_method(const OBJ_NAME* name, void* arg) {
17371738

17381739
Optional<string> eval_cipher(CipherCtx::cipher_action action, const string& data, const string& method, const string& key, int64_t options, const string& iv,
17391740
string& tag, const string& aad) {
1741+
constexpr static auto record_openssl_builtin_call{[](CipherCtx::cipher_action action, const string& method) noexcept {
1742+
constexpr static std::string_view encrypt_builtin_name = "openssl_encrypt";
1743+
constexpr static std::string_view decrypt_builtin_name = "openssl_decrypt";
1744+
const std::string_view builtin_name = action == CipherCtx::encrypt ? encrypt_builtin_name : decrypt_builtin_name;
1745+
kphp::stl::string<kphp::memory::script_allocator> virtual_builtin_name;
1746+
virtual_builtin_name.reserve(builtin_name.size() + 1 + method.size());
1747+
virtual_builtin_name.append(builtin_name.data()).append("_").append(method.c_str());
1748+
runtime_builtins_stats::save_virtual_builtin_call_stats(virtual_builtin_name);
1749+
}};
1750+
17401751
CipherCtx cipher{method, options, action};
17411752
if (cipher && cipher.init(key, iv, tag) && cipher.update(data, aad) && cipher.finalize()) {
17421753
if (action == CipherCtx::cipher_action::encrypt && !cipher.make_tag(tag)) {
17431754
return false;
17441755
}
1756+
// record only success calls
1757+
record_openssl_builtin_call(action, method);
17451758
return cipher.flush_result();
17461759
}
17471760
return false;

runtime/runtime-builtin-stats.h

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,51 @@
44

55
#pragma once
66

7+
#include <cstddef>
78
#include <cstdint>
9+
#include <functional>
810
#include <optional>
911
#include <string_view>
1012

1113
#include "runtime-common/core/allocator/script-allocator.h"
1214
#include "runtime-common/core/std/containers.h"
1315

14-
#define SAVE_BUILTIN_CALL_STATS(builtin_name, builtin_call) \
15-
(!runtime_builtins_stats::impl_::is_request_stats_enabled ? 0 : (*runtime_builtins_stats::request_stats.stats)[std::string_view(builtin_name)]++, \
16-
builtin_call)
16+
template<>
17+
struct std::hash<kphp::stl::string<kphp::memory::script_allocator>> {
18+
std::size_t operator()(const kphp::stl::string<kphp::memory::script_allocator>& s) const noexcept {
19+
std::string_view view{s.c_str(), s.size()};
20+
return std::hash<std::string_view>{}(view);
21+
}
22+
};
1723

1824
namespace runtime_builtins_stats {
19-
20-
namespace impl_ {
21-
inline bool is_request_stats_enabled = false;
22-
} // namespace impl_
23-
2425
inline bool is_server_option_enabled = false;
2526

2627
struct request_stats_t {
27-
std::optional<kphp::stl::unordered_map<std::string_view, int64_t, kphp::memory::script_allocator>> stats{};
28+
kphp::stl::unordered_map<std::string_view, int64_t, kphp::memory::script_allocator> builtin_stats{};
29+
kphp::stl::unordered_map<kphp::stl::string<kphp::memory::script_allocator>, int64_t, kphp::memory::script_allocator> virtual_builtin_stats{};
2830
};
2931

30-
inline request_stats_t request_stats;
32+
inline std::optional<request_stats_t> request_stats;
3133

3234
inline void init_request_stats() noexcept {
33-
php_assert(!request_stats.stats.has_value());
34-
impl_::is_request_stats_enabled = is_server_option_enabled;
35-
request_stats.stats.emplace();
35+
php_assert(!request_stats.has_value());
36+
if (is_server_option_enabled) {
37+
request_stats.emplace();
38+
}
3639
}
3740

3841
inline void reset_request_stats() noexcept {
39-
php_assert(request_stats.stats.has_value());
40-
impl_::is_request_stats_enabled = false;
41-
request_stats.stats.reset();
42+
request_stats.reset();
4243
}
4344

45+
inline void save_virtual_builtin_call_stats(const kphp::stl::string<kphp::memory::script_allocator>& builtin_call) noexcept {
46+
if (runtime_builtins_stats::request_stats.has_value()) {
47+
(*runtime_builtins_stats::request_stats).virtual_builtin_stats[builtin_call]++;
48+
}
49+
}
4450
} // namespace runtime_builtins_stats
51+
52+
#define SAVE_BUILTIN_CALL_STATS(builtin_name, builtin_call) \
53+
(!runtime_builtins_stats::request_stats.has_value() ? 0 : (*runtime_builtins_stats::request_stats).builtin_stats[std::string_view(builtin_name)]++, \
54+
builtin_call)

runtime/streams.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "runtime/allocator.h"
1414
#include "runtime/array_functions.h"
1515
#include "runtime/critical_section.h"
16+
#include "runtime/runtime-builtin-stats.h"
1617

1718
DEFINE_VERBOSITY(streams);
1819

@@ -54,12 +55,18 @@ static const stream_functions* get_stream_functions_from_url(const string& url,
5455
tvkprintf(streams, 2, "PHP streams: %s is processing stream %.200s\n", invoker_name, url.c_str());
5556

5657
void* res = memmem(static_cast<const void*>(url.c_str()), url.size(), static_cast<const void*>("://"), 3);
58+
59+
const stream_functions* functions_table{default_stream_functions};
5760
if (res != nullptr) {
5861
const char* wrapper_end = static_cast<const char*>(res);
59-
return get_stream_functions(string(url.c_str(), static_cast<string::size_type>(wrapper_end - url.c_str())));
62+
functions_table = get_stream_functions(string(url.c_str(), static_cast<string::size_type>(wrapper_end - url.c_str())));
6063
}
6164

62-
return default_stream_functions;
65+
kphp::stl::string<kphp::memory::script_allocator> builtin_name{invoker_name};
66+
builtin_name.append("_").append(functions_table->name.c_str());
67+
runtime_builtins_stats::save_virtual_builtin_call_stats(builtin_name);
68+
69+
return functions_table;
6370
}
6471

6572
mixed f$stream_context_create(const mixed& options) {

server/server-stats.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ void ServerStats::after_fork(pid_t worker_pid, uint64_t active_connections, uint
637637
}
638638

639639
void ServerStats::add_request_stats(double script_time_sec, double net_time_sec, double script_max_running_interval_sec, double script_init_time_sec, double connection_process_time_sec,
640-
int64_t script_queries, int64_t long_script_queries, const memory_resource::MemoryStats &script_memory_stats, const runtime_builtins_stats::request_stats_t &builtin_stats,
640+
int64_t script_queries, int64_t long_script_queries, const memory_resource::MemoryStats &script_memory_stats, const std::optional<runtime_builtins_stats::request_stats_t> &builtin_stats,
641641
int64_t curl_total_allocated, process_rusage_t script_rusage, script_error_t error) noexcept {
642642
auto &stats = worker_type_ == WorkerType::job_worker ? shared_stats_->job_workers : shared_stats_->general_workers;
643643
const auto script_time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::duration<double>(script_time_sec));

server/server-stats.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class ServerStats : vk::not_copyable {
2323

2424
void add_request_stats(double script_time_sec, double net_time_sec, double script_max_running_interval_sec, double script_init_time_sec, double connection_process_time_sec,
2525
int64_t script_queries, int64_t long_script_queries,
26-
const memory_resource::MemoryStats &script_memory_stats, const runtime_builtins_stats::request_stats_t &builtin_stats,
26+
const memory_resource::MemoryStats &script_memory_stats, const std::optional<runtime_builtins_stats::request_stats_t> &builtin_stats,
2727
int64_t curl_total_allocated, process_rusage_t script_rusage, script_error_t error) noexcept;
2828
void add_job_stats(double job_wait_time_sec, int64_t request_memory_used, int64_t request_real_memory_used, int64_t response_memory_used,
2929
int64_t response_real_memory_used) noexcept;

server/statshouse/statshouse-manager.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void StatsHouseManager::generic_cron_check_if_tag_host_needed() {
109109
}
110110

111111
void StatsHouseManager::add_request_stats(uint64_t script_time_ns, uint64_t net_time_ns, uint64_t script_max_running_interval_ns, script_error_t error,
112-
const memory_resource::MemoryStats &script_memory_stats, const runtime_builtins_stats::request_stats_t &builtin_stats,
112+
const memory_resource::MemoryStats &script_memory_stats, const std::optional<runtime_builtins_stats::request_stats_t> &builtin_stats,
113113
uint64_t script_queries, uint64_t long_script_queries,
114114
uint64_t script_user_time_ns, uint64_t script_system_time_ns,
115115
uint64_t script_init_time, uint64_t http_connection_process_time,
@@ -141,10 +141,13 @@ void StatsHouseManager::add_request_stats(uint64_t script_time_ns, uint64_t net_
141141
client.metric("kphp_by_host_request_errors", true).tag(status).tag(worker_type).write_count(1);
142142
}
143143

144-
if (builtin_stats.stats.has_value()) {
145-
for (const auto& [builtin_name, call_number] : *builtin_stats.stats) {
144+
if (builtin_stats.has_value()) {
145+
for (const auto& [builtin_name, call_number] : (*builtin_stats).builtin_stats) {
146146
client.metric("kphp_request_builtin_stats").tag(builtin_name).write_value(call_number);
147147
}
148+
for (const auto& [virtual_builtin_name, call_number] : (*builtin_stats).virtual_builtin_stats) {
149+
client.metric("kphp_request_builtin_stats").tag(virtual_builtin_name.c_str()).write_value(call_number);
150+
}
148151
}
149152

150153
client.metric("kphp_memory_script_usage").tag("used").tag(worker_type).write_value(script_memory_stats.memory_used);

server/statshouse/statshouse-manager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class StatsHouseManager : vk::not_copyable {
5959
}
6060

6161
void add_request_stats(uint64_t script_time_ns, uint64_t net_time_ns, uint64_t script_max_running_interval_ns, script_error_t error,
62-
const memory_resource::MemoryStats &script_memory_stats, const runtime_builtins_stats::request_stats_t &builtin_stats,
62+
const memory_resource::MemoryStats &script_memory_stats, const std::optional<runtime_builtins_stats::request_stats_t> &builtin_stats,
6363
uint64_t script_queries, uint64_t long_script_queries,
6464
uint64_t script_user_time_ns, uint64_t script_system_time_ns,
6565
uint64_t script_init_time, uint64_t http_connection_process_time,

0 commit comments

Comments
 (0)