Program Listing for File tohost_monitor.cpp
↰ Return to documentation for file (tohost_monitor.cpp
)
#include <cassert>
#include <cstdint>
#include <format>
#include "tohost_monitor.hpp"
void ToHostElinkStats::update_processed_chunk(uint8_t status, uint32_t size) {
++processed_chunks;
if ( size > largest_chunk_size){
largest_chunk_size = size;
}
processed_bytes += size;
if (status & SW_TRUNC){++sw_trunc_chunks;}
if (status & FW_TRUNC){++fw_trunc_chunks;}
if (status & SW_MALF) {++sw_error_chunks;}
if (status & FW_MALF) {++fw_error_chunks;}
if (status & FW_CRC) {++fw_crc_chunks;}
}
ToHostElinkStats ToHostElinkStats::get_increment(ToHostElinkStats & previous)
{
assert(this->fid == previous.fid);
struct timespec now;
ToHostElinkStats output(previous.fid);
//Counters
output.dropped_blocks = this->dropped_blocks;
output.processed_blocks = this->processed_blocks;
output.processed_chunks = this->processed_chunks;
output.processed_bytes = this->processed_bytes;
output.largest_chunk_size = this->largest_chunk_size;
output.sw_trunc_chunks = this->sw_trunc_chunks;
output.fw_trunc_chunks = this->fw_trunc_chunks;
output.sw_error_chunks = this->sw_error_chunks;
output.fw_error_chunks = this->fw_error_chunks;
output.fw_crc_chunks = this->fw_crc_chunks;
output.oosequence_l0id = this->oosequence_l0id;
//Rates
clock_gettime(CLOCK_MONOTONIC_RAW , &now);
float seconds = now.tv_sec - previous.ts.tv_sec + 1e-9*(now.tv_nsec - previous.ts.tv_nsec);
float chunk_increment = static_cast<float>(output.processed_chunks - previous.processed_chunks);
float bytes_increment = static_cast<float>(output.processed_bytes - previous.processed_bytes);
output.rate_chunks_kHz = (chunk_increment / seconds) / 1000.;
output.average_chunk_bytes = chunk_increment > 0 ? static_cast<uint32_t>(bytes_increment / chunk_increment) : 0;
//Update old version of quantities for which a rate is printed
previous.processed_chunks = this->processed_chunks ;
previous.processed_bytes = this->processed_bytes ;
previous.ts = now;
return output;
}
void ToHostMonitor::append_device_stats(const std::string& ts, const std::string& hostname, const ToHostDeviceStats & s)
{
};
void ToHostMonitor::append_dma_stats(const std::string& ts, const std::string& hostname, int device, const ToHostDmaStats & ds)
{
nlohmann::json j;
j["dma_free_MB"] = ds.dma_free_MB;
j["irqs"] = ds.irq_count;
m_message = nlohmann::json();
m_message["ts"] = ts;
m_message["host"][hostname]
["app"]["tohost"]
["device"][std::to_string(device)]
["dma"][std::to_string(ds.dmaid)] = j;
write_message();
}
void ToHostMonitor::append_reader_stats(const std::string& ts, const std::string& hostname, int device, int dma_id, const ToHostReaderStats & rs)
{
nlohmann::json j;
j["type"] = rs.type;
j["subscriptions"] = rs.number_of_subscriptions;
j["net_resources"] = rs.number_of_network_resources;
j["net_calls"] = rs.number_of_network_resource_calls;
m_message = nlohmann::json();
m_message["ts"] = ts;
m_message["host"][hostname]
["app"]["tohost"]
["device"][std::to_string(device)]
["dma"][std::to_string(dma_id)]
["thread"][std::to_string(rs.reader_id)] = j;
write_message();
}
void ToHostMonitor::append_elink_stats(const std::string& ts, const std::string& hostname, int device, int dma_id, int reader_id, const ToHostElinkStats & es)
{
nlohmann::json j;
j["blocks"] = es.processed_blocks ;
j["dropped_blocks"] = es.dropped_blocks ;
j["chunks"] = es.processed_chunks ;
j["chunk_kHz"] = es.rate_chunks_kHz ;
j["avg_chunk_size"] = es.average_chunk_bytes;
j["max_chunk_size"] = es.largest_chunk_size ;
j["sw_trunc_chunks"] = es.sw_trunc_chunks ;
j["fw_trunc_chunks"] = es.fw_trunc_chunks ;
j["sw_error_chunks"] = es.sw_error_chunks ;
j["fw_error_chunks"] = es.fw_error_chunks ;
j["fw_crc_chunks"] = es.fw_crc_chunks ;
j["oosequence_l0id"] = es.oosequence_l0id ;
m_message = nlohmann::json();
m_message["ts"] = ts;
m_message["host"][hostname]
["app"]["tohost"]
["device"][std::to_string(device)]
["dma"][std::to_string(dma_id)]
["thread"][std::to_string(reader_id)]
["fid"][std::format("{:#0x}", es.fid)] = j;
write_message();
}