#include "common/ceph_argparse.h"
#include "common/pick_address.h"
+#include "common/JSONFormatter.h"
#include "common/Throttle.h"
#include "common/Timer.h"
#include "common/errno.h"
#ifndef ASYNC_RESERVER_H
#define ASYNC_RESERVER_H
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/ceph_context.h"
#include "common/ceph_mutex.h"
#include "include/Context.h"
FixedCDC.cc
Formatter.cc
Graylog.cc
+ JSONFormatter.cc
HTMLFormatter.cc
HeartbeatMap.cc
LogClient.cc
Readahead.cc
RefCountedObj.cc
SloppyCRCMap.cc
+ TableFormatter.cc
Thread.cc
Throttle.cc
Timer.cc
TracepointProvider.cc
TrackedOp.cc
WorkQueue.cc
+ XMLFormatter.cc
admin_socket.cc
admin_socket_client.cc
assert.cc
#define LARGE_SIZE 1024
+#include "Formatter.h"
+#include "JSONFormatter.h"
#include "HTMLFormatter.h"
+#include "TableFormatter.h"
+#include "XMLFormatter.h"
#include "common/escape.h"
#include "common/StackStringStream.h"
#include "include/buffer.h"
#include <algorithm>
#include <set>
#include <limits>
-#include <utility>
-#include <boost/container/small_vector.hpp>
// -----------------------
namespace ceph {
va_end(ap);
}
-// -----------------------
-
-void JSONFormatter::flush(std::ostream& os)
-{
- finish_pending_string();
- os << m_ss.str();
- if (m_line_break_enabled)
- os << "\n";
- m_ss.clear();
- m_ss.str("");
-}
-
-void JSONFormatter::reset()
-{
- m_stack.clear();
- m_ss.clear();
- m_ss.str("");
- m_pending_string.clear();
- m_pending_string.str("");
-}
-
-void JSONFormatter::print_comma(json_formatter_stack_entry_d& entry)
-{
- auto& ss = get_ss();
- if (entry.size) {
- if (m_pretty) {
- ss << ",\n";
- for (unsigned i = 1; i < m_stack.size(); i++)
- ss << " ";
- } else {
- ss << ",";
- }
- } else if (m_pretty) {
- ss << "\n";
- for (unsigned i = 1; i < m_stack.size(); i++)
- ss << " ";
- }
- if (m_pretty && entry.is_array)
- ss << " ";
-}
-
-void JSONFormatter::print_quoted_string(std::string_view s)
-{
- auto& ss = get_ss();
- ss << '\"' << json_stream_escaper(s) << '\"';
-}
-
-void JSONFormatter::print_name(std::string_view name)
-{
- auto& ss = get_ss();
- finish_pending_string();
- if (m_stack.empty())
- return;
- struct json_formatter_stack_entry_d& entry = m_stack.back();
- print_comma(entry);
- if (!entry.is_array) {
- if (m_pretty) {
- ss << " ";
- }
- ss << "\"" << name << "\"";
- if (m_pretty)
- ss << ": ";
- else
- ss << ':';
- }
- ++entry.size;
-}
-
-void JSONFormatter::open_section(std::string_view name, const char *ns, bool is_array)
-{
- auto& ss = get_ss();
- if (handle_open_section(name, ns, is_array)) {
- return;
- }
- if (ns) {
- std::ostringstream oss;
- oss << name << " " << ns;
- print_name(oss.str().c_str());
- } else {
- print_name(name);
- }
- if (is_array)
- ss << '[';
- else
- ss << '{';
-
- json_formatter_stack_entry_d n;
- n.is_array = is_array;
- m_stack.push_back(n);
-}
-
-void JSONFormatter::open_array_section(std::string_view name)
-{
- open_section(name, nullptr, true);
-}
-
-void JSONFormatter::open_array_section_in_ns(std::string_view name, const char *ns)
-{
- open_section(name, ns, true);
-}
-
-void JSONFormatter::open_object_section(std::string_view name)
-{
- open_section(name, nullptr, false);
-}
-
-void JSONFormatter::open_object_section_in_ns(std::string_view name, const char *ns)
-{
- open_section(name, ns, false);
-}
-
-void JSONFormatter::close_section()
-{
- auto& ss = get_ss();
- if (handle_close_section()) {
- return;
- }
- ceph_assert(!m_stack.empty());
- finish_pending_string();
-
- struct json_formatter_stack_entry_d& entry = m_stack.back();
- if (m_pretty && entry.size) {
- ss << "\n";
- for (unsigned i = 1; i < m_stack.size(); i++)
- ss << " ";
- }
- ss << (entry.is_array ? ']' : '}');
- m_stack.pop_back();
- if (m_pretty && m_stack.empty())
- ss << "\n";
-}
-
-void JSONFormatter::finish_pending_string()
-{
- if (m_is_pending_string) {
- m_is_pending_string = false;
- add_value(m_pending_name.c_str(), m_pending_string.str(), true);
- m_pending_string.str("");
- }
-}
-
-void JSONFormatter::add_value(std::string_view name, double val) {
- CachedStackStringStream css;
- if (!std::isfinite(val) || std::isnan(val)) {
- *css << "null";
- } else {
- css->precision(std::numeric_limits<double>::max_digits10);
- *css << val;
- }
- add_value(name, css->strv(), false);
-}
-
-template <class T>
-void JSONFormatter::add_value(std::string_view name, T val)
-{
- CachedStackStringStream css;
- css->precision(std::numeric_limits<T>::max_digits10);
- *css << val;
- add_value(name, css->strv(), false);
-}
-
-void JSONFormatter::add_value(std::string_view name, std::string_view val, bool quoted)
-{
- auto& ss = get_ss();
- if (handle_value(name, val, quoted)) {
- return;
- }
- print_name(name);
- if (!quoted) {
- ss << val;
- } else {
- print_quoted_string(val);
- }
-}
-
-void JSONFormatter::dump_null(std::string_view name)
-{
- add_value(name, "null");
-}
-
-void JSONFormatter::dump_unsigned(std::string_view name, uint64_t u)
-{
- add_value(name, u);
-}
-
-void JSONFormatter::dump_int(std::string_view name, int64_t s)
-{
- add_value(name, s);
-}
-
-void JSONFormatter::dump_float(std::string_view name, double d)
-{
- add_value(name, d);
-}
-
-void JSONFormatter::dump_string(std::string_view name, std::string_view s)
-{
- add_value(name, s, true);
-}
-
-std::ostream& JSONFormatter::dump_stream(std::string_view name)
-{
- finish_pending_string();
- m_pending_name = name;
- m_is_pending_string = true;
- return m_pending_string;
-}
-
-void JSONFormatter::dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap)
-{
- auto buf = boost::container::small_vector<char, LARGE_SIZE>{
- LARGE_SIZE, boost::container::default_init};
-
- va_list ap_copy;
- va_copy(ap_copy, ap);
- int len = vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
- va_end(ap_copy);
-
- if (std::cmp_greater_equal(len, buf.size())) {
- // output was truncated, allocate a buffer large enough
- buf.resize(len + 1, boost::container::default_init);
- vsnprintf(buf.data(), buf.size(), fmt, ap);
- }
-
- add_value(name, buf.data(), quoted);
-}
-
-int JSONFormatter::get_len() const
-{
- return m_ss.tellp();
-}
-
-void JSONFormatter::write_raw_data(const char *data)
-{
- get_ss() << data;
-}
-
-const char *XMLFormatter::XML_1_DTD =
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
-
-XMLFormatter::XMLFormatter(bool pretty, bool lowercased, bool underscored)
-: m_pretty(pretty),
- m_lowercased(lowercased),
- m_underscored(underscored)
-{
- reset();
-}
-
-void XMLFormatter::flush(std::ostream& os)
-{
- finish_pending_string();
- std::string m_ss_str = m_ss.str();
- os << m_ss_str;
- /* There is a small catch here. If the rest of the formatter had NO output,
- * we should NOT output a newline. This primarily triggers on HTTP redirects */
- if (m_pretty && !m_ss_str.empty())
- os << "\n";
- else if (m_line_break_enabled)
- os << "\n";
- m_ss.clear();
- m_ss.str("");
-}
-
-void XMLFormatter::reset()
-{
- m_ss.clear();
- m_ss.str("");
- m_pending_string.clear();
- m_pending_string.str("");
- m_sections.clear();
- m_pending_string_name.clear();
- m_header_done = false;
-}
-
-void XMLFormatter::output_header()
-{
- if(!m_header_done) {
- m_header_done = true;
- write_raw_data(XMLFormatter::XML_1_DTD);
- if (m_pretty)
- m_ss << "\n";
- }
-}
-
-void XMLFormatter::output_footer()
-{
- while(!m_sections.empty()) {
- close_section();
- }
-}
-
-void XMLFormatter::open_object_section(std::string_view name)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void XMLFormatter::open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
-{
- open_section_in_ns(name, NULL, &attrs);
-}
-
-void XMLFormatter::open_object_section_in_ns(std::string_view name, const char *ns)
-{
- open_section_in_ns(name, ns, NULL);
-}
-
-void XMLFormatter::open_array_section(std::string_view name)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void XMLFormatter::open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
-{
- open_section_in_ns(name, NULL, &attrs);
-}
-
-void XMLFormatter::open_array_section_in_ns(std::string_view name, const char *ns)
-{
- open_section_in_ns(name, ns, NULL);
-}
-
-std::string XMLFormatter::get_xml_name(std::string_view name) const
-{
- std::string e(name);
- std::transform(e.begin(), e.end(), e.begin(),
- [this](char c) { return this->to_lower_underscore(c); });
- return e;
-}
-
-void XMLFormatter::close_section()
-{
- ceph_assert(!m_sections.empty());
- finish_pending_string();
-
- auto section = get_xml_name(m_sections.back());
- m_sections.pop_back();
- print_spaces();
- m_ss << "</" << section << ">";
- if (m_pretty)
- m_ss << "\n";
-}
-
-template <class T>
-void XMLFormatter::add_value(std::string_view name, T val)
-{
- auto e = get_xml_name(name);
- print_spaces();
- m_ss.precision(std::numeric_limits<T>::max_digits10);
- m_ss << "<" << e << ">" << val << "</" << e << ">";
- if (m_pretty)
- m_ss << "\n";
-}
-
-void XMLFormatter::dump_null(std::string_view name)
-{
- print_spaces();
- m_ss << "<" << get_xml_name(name) << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\" />";
- if (m_pretty)
- m_ss << "\n";
-}
-
-void XMLFormatter::dump_unsigned(std::string_view name, uint64_t u)
-{
- add_value(name, u);
-}
-
-void XMLFormatter::dump_int(std::string_view name, int64_t s)
-{
- add_value(name, s);
-}
-
-void XMLFormatter::dump_float(std::string_view name, double d)
-{
- add_value(name, d);
-}
-
-void XMLFormatter::dump_string(std::string_view name, std::string_view s)
-{
- auto e = get_xml_name(name);
- print_spaces();
- m_ss << "<" << e << ">" << xml_stream_escaper(s) << "</" << e << ">";
- if (m_pretty)
- m_ss << "\n";
-}
-
-void XMLFormatter::dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs)
-{
- auto e = get_xml_name(name);
- std::string attrs_str;
- get_attrs_str(&attrs, attrs_str);
- print_spaces();
- m_ss << "<" << e << attrs_str << ">" << xml_stream_escaper(s) << "</" << e << ">";
- if (m_pretty)
- m_ss << "\n";
-}
-
-std::ostream& XMLFormatter::dump_stream(std::string_view name)
-{
- print_spaces();
- m_pending_string_name = name;
- m_ss << "<" << m_pending_string_name << ">";
- return m_pending_string;
-}
-
-void XMLFormatter::dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap)
-{
- auto buf = boost::container::small_vector<char, LARGE_SIZE>{
- LARGE_SIZE, boost::container::default_init};
-
- va_list ap_copy;
- va_copy(ap_copy, ap);
- int len = vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
- va_end(ap_copy);
-
- if (std::cmp_greater_equal(len, buf.size())) {
- // output was truncated, allocate a buffer large enough
- buf.resize(len + 1, boost::container::default_init);
- vsnprintf(buf.data(), buf.size(), fmt, ap);
- }
-
- auto e = get_xml_name(name);
-
- print_spaces();
- if (ns) {
- m_ss << "<" << e << " xmlns=\"" << ns << "\">" << xml_stream_escaper(std::string_view(buf.data(), len)) << "</" << e << ">";
- } else {
- m_ss << "<" << e << ">" << xml_stream_escaper(std::string_view(buf.data(), len)) << "</" << e << ">";
- }
-
- if (m_pretty)
- m_ss << "\n";
-}
-
-int XMLFormatter::get_len() const
-{
- return m_ss.str().size();
-}
-
-void XMLFormatter::write_raw_data(const char *data)
-{
- m_ss << data;
-}
-
-void XMLFormatter::write_bin_data(const char* buff, int buf_len)
-{
- std::stringbuf *pbuf = m_ss.rdbuf();
- pbuf->sputn(buff, buf_len);
- m_ss.seekg(buf_len);
-}
-
-void XMLFormatter::get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const
-{
- CachedStackStringStream css;
-
- for (const auto &p : attrs->attrs) {
- *css << " " << p.first << "=" << "\"" << p.second << "\"";
- }
-
- attrs_str = css->strv();
-}
-
-void XMLFormatter::open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs)
-{
- print_spaces();
- std::string attrs_str;
-
- if (attrs) {
- get_attrs_str(attrs, attrs_str);
- }
-
- auto e = get_xml_name(name);
-
- if (ns) {
- m_ss << "<" << e << attrs_str << " xmlns=\"" << ns << "\">";
- } else {
- m_ss << "<" << e << attrs_str << ">";
- }
- if (m_pretty)
- m_ss << "\n";
- m_sections.push_back(std::string(name));
-}
-
-void XMLFormatter::finish_pending_string()
-{
- if (!m_pending_string_name.empty()) {
- m_ss << xml_stream_escaper(m_pending_string.str())
- << "</" << m_pending_string_name << ">";
- m_pending_string_name.clear();
- m_pending_string.str(std::string());
- if (m_pretty) {
- m_ss << "\n";
- }
- }
-}
-
-void XMLFormatter::print_spaces()
-{
- finish_pending_string();
- if (m_pretty) {
- std::string spaces(m_sections.size(), ' ');
- m_ss << spaces;
- }
-}
-
-char XMLFormatter::to_lower_underscore(char c) const
-{
- if (m_underscored && c == ' ') {
- return '_';
- } else if (m_lowercased) {
- return std::tolower(c);
- }
- return c;
-}
-
-TableFormatter::TableFormatter(bool keyval) : m_keyval(keyval)
-{
- reset();
-}
-
-void TableFormatter::flush(std::ostream& os)
-{
- finish_pending_string();
- std::vector<size_t> column_size = m_column_size;
- std::vector<std::string> column_name = m_column_name;
-
- std::set<int> need_header_set;
-
- // auto-sizing columns
- for (size_t i = 0; i < m_vec.size(); i++) {
- for (size_t j = 0; j < m_vec[i].size(); j++) {
- column_size.resize(m_vec[i].size());
- column_name.resize(m_vec[i].size());
- if (i > 0) {
- if (m_vec[i - 1][j] != m_vec[i][j]) {
- // changing row labels require to show the header
- need_header_set.insert(i);
- column_name[i] = m_vec[i][j].first;
- }
- } else {
- column_name[i] = m_vec[i][j].first;
- }
-
- if (m_vec[i][j].second.length() > column_size[j])
- column_size[j] = m_vec[i][j].second.length();
- if (m_vec[i][j].first.length() > column_size[j])
- column_size[j] = m_vec[i][j].first.length();
- }
- }
-
- bool need_header = false;
- if ((column_size.size() == m_column_size.size())) {
- for (size_t i = 0; i < column_size.size(); i++) {
- if (column_size[i] != m_column_size[i]) {
- need_header = true;
- break;
- }
- }
- } else {
- need_header = true;
- }
-
- if (need_header) {
- // first row always needs a header if there wasn't one before
- need_header_set.insert(0);
- }
-
- m_column_size = column_size;
- for (size_t i = 0; i < m_vec.size(); i++) {
- if (i == 0) {
- if (need_header_set.count(i)) {
- // print the header
- if (!m_keyval) {
- os << "+";
- for (size_t j = 0; j < m_vec[i].size(); j++) {
- for (size_t v = 0; v < m_column_size[j] + 3; v++)
- os << "-";
- os << "+";
- }
- os << "\n";
- os << "|";
-
- for (size_t j = 0; j < m_vec[i].size(); j++) {
- os << fmt::format(" {:<{}}|",
- m_vec[i][j].first, m_column_size[j] + 2);
- }
- os << "\n";
- os << "+";
- for (size_t j = 0; j < m_vec[i].size(); j++) {
- for (size_t v = 0; v < m_column_size[j] + 3; v++)
- os << "-";
- os << "+";
- }
- os << "\n";
- }
- }
- }
- // print body
- if (!m_keyval)
- os << "|";
- for (size_t j = 0; j < m_vec[i].size(); j++) {
- if (!m_keyval)
- os << " ";
- if (m_keyval) {
- os << "key::";
- os << m_vec[i][j].first;
- os << "=";
- os << "\"";
- os << m_vec[i][j].second;
- os << "\" ";
- } else {
- os << fmt::format("{:<{}}|", m_vec[i][j].second, m_column_size[j] + 2);
- }
- }
-
- os << "\n";
- if (!m_keyval) {
- if (i == (m_vec.size() - 1)) {
- // print trailer
- os << "+";
- for (size_t j = 0; j < m_vec[i].size(); j++) {
- for (size_t v = 0; v < m_column_size[j] + 3; v++)
- os << "-";
- os << "+";
- }
- os << "\n";
- }
- }
- m_vec[i].clear();
- }
- m_vec.clear();
-}
-
-void TableFormatter::reset()
-{
- m_ss.clear();
- m_ss.str("");
- m_section_cnt.clear();
- m_column_size.clear();
- m_section_open = 0;
-}
-
-void TableFormatter::open_object_section(std::string_view name)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void TableFormatter::open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void TableFormatter::open_object_section_in_ns(std::string_view name, const char *ns)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void TableFormatter::open_array_section(std::string_view name)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void TableFormatter::open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void TableFormatter::open_array_section_in_ns(std::string_view name, const char *ns)
-{
- open_section_in_ns(name, NULL, NULL);
-}
-
-void TableFormatter::open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs)
-{
- m_section.push_back(std::string(name));
- m_section_open++;
-}
-
-void TableFormatter::close_section()
-{
- //
- m_section_open--;
- if (m_section.size()) {
- m_section_cnt[m_section.back()] = 0;
- m_section.pop_back();
- }
-}
-
-size_t TableFormatter::m_vec_index(std::string_view name)
-{
- std::string key(name);
-
- size_t i = m_vec.size();
- if (i)
- i--;
-
- // make sure there are vectors to push back key/val pairs
- if (!m_vec.size())
- m_vec.resize(1);
-
- if (m_vec.size()) {
- if (m_vec[i].size()) {
- if (m_vec[i][0].first == key) {
- // start a new column if a key is repeated
- m_vec.resize(m_vec.size() + 1);
- i++;
- }
- }
- }
-
- return i;
-}
-
-std::string TableFormatter::get_section_name(std::string_view name)
-{
- std::string t_name{name};
- for (const auto &i : m_section) {
- t_name.insert(0, ":");
- t_name.insert(0, i);
- }
- if (m_section_open) {
- std::stringstream lss;
- lss << t_name;
- lss << "[";
- lss << m_section_cnt[t_name]++;
- lss << "]";
- return lss.str();
- } else {
- return t_name;
- }
-}
-
-template <class T>
-void TableFormatter::add_value(std::string_view name, T val) {
- finish_pending_string();
- size_t i = m_vec_index(name);
- m_ss.precision(std::numeric_limits<double>::max_digits10);
- m_ss << val;
-
- m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
- m_ss.clear();
- m_ss.str("");
-}
-
-void TableFormatter::dump_null(std::string_view name)
-{
- add_value(name, "null");
-}
-
-void TableFormatter::dump_unsigned(std::string_view name, uint64_t u)
-{
- add_value(name, u);
-}
-
-void TableFormatter::dump_int(std::string_view name, int64_t s)
-{
- add_value(name, s);
-}
-
-void TableFormatter::dump_float(std::string_view name, double d)
-{
- add_value(name, d);
}
-
-void TableFormatter::dump_string(std::string_view name, std::string_view s)
-{
- finish_pending_string();
- size_t i = m_vec_index(name);
- m_ss << s;
-
- m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
- m_ss.clear();
- m_ss.str("");
-}
-
-void TableFormatter::dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs)
-{
- finish_pending_string();
- size_t i = m_vec_index(name);
-
- std::string attrs_str;
- get_attrs_str(&attrs, attrs_str);
- m_ss << attrs_str << s;
-
- m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
- m_ss.clear();
- m_ss.str("");
-}
-
-void TableFormatter::dump_format_va(std::string_view name,
- const char *ns, bool quoted,
- const char *fmt, va_list ap)
-{
- finish_pending_string();
- auto buf = boost::container::small_vector<char, LARGE_SIZE>{
- LARGE_SIZE, boost::container::default_init};
-
- va_list ap_copy;
- va_copy(ap_copy, ap);
- int len = vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
- va_end(ap_copy);
-
- if (std::cmp_greater_equal(len, buf.size())) {
- // output was truncated, allocate a buffer large enough
- buf.resize(len + 1, boost::container::default_init);
- vsnprintf(buf.data(), buf.size(), fmt, ap);
- }
-
- size_t i = m_vec_index(name);
- if (ns) {
- m_ss << ns << "." << buf.data();
- } else {
- m_ss << buf.data();
- }
-
- m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
- m_ss.clear();
- m_ss.str("");
-}
-
-std::ostream& TableFormatter::dump_stream(std::string_view name)
-{
- finish_pending_string();
- // we don't support this
- m_pending_name = name;
- return m_ss;
-}
-
-int TableFormatter::get_len() const
-{
- // we don't know the size until flush is called
- return 0;
-}
-
-void TableFormatter::write_raw_data(const char *data) {
- // not supported
-}
-
-void TableFormatter::get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const
-{
- CachedStackStringStream css;
-
- for (const auto &p : attrs->attrs) {
- *css << " " << p.first << "=" << "\"" << p.second << "\"";
- }
-
- attrs_str = css->strv();
-}
-
-void TableFormatter::finish_pending_string()
-{
- if (m_pending_name.length()) {
- std::string ss = m_ss.str();
- m_ss.clear();
- m_ss.str("");
- std::string pending_name = m_pending_name;
- m_pending_name = "";
- dump_string(pending_name.c_str(), ss);
- }
-}
-}
-
#include "include/buffer_fwd.h"
-#include <deque>
-#include <fstream>
#include <functional>
#include <list>
#include <memory>
-#include <vector>
+#include <string>
+
#include <stdarg.h>
-#include <sstream>
-#include <map>
-#include <vector>
namespace ceph {
virtual void write_bin_data(const char* buff, int buf_len);
};
- class JSONFormatter : public Formatter {
- public:
- explicit JSONFormatter(bool p = false) : m_pretty(p) {}
- JSONFormatter(const JSONFormatter& f) :
- m_pretty(f.m_pretty),
- m_pending_name(f.m_pending_name),
- m_stack(f.m_stack),
- m_is_pending_string(f.m_is_pending_string),
- m_line_break_enabled(f.m_line_break_enabled)
- {
- m_ss.str(f.m_ss.str());
- m_pending_string.str(f.m_pending_string.str());
- }
- JSONFormatter(JSONFormatter&& f) :
- m_pretty(f.m_pretty),
- m_ss(std::move(f.m_ss)),
- m_pending_string(std::move(f.m_pending_string)),
- m_pending_name(f.m_pending_name),
- m_stack(std::move(f.m_stack)),
- m_is_pending_string(f.m_is_pending_string),
- m_line_break_enabled(f.m_line_break_enabled)
- {
- }
- JSONFormatter& operator=(const JSONFormatter& f)
- {
- m_pretty = f.m_pretty;
- m_ss.str(f.m_ss.str());
- m_pending_string.str(f.m_pending_string.str());
- m_pending_name = f.m_pending_name;
- m_stack = f.m_stack;
- m_is_pending_string = f.m_is_pending_string;
- m_line_break_enabled = f.m_line_break_enabled;
- return *this;
- }
-
- JSONFormatter& operator=(JSONFormatter&& f)
- {
- m_pretty = f.m_pretty;
- m_ss = std::move(f.m_ss);
- m_pending_string = std::move(f.m_pending_string);
- m_pending_name = f.m_pending_name;
- m_stack = std::move(f.m_stack);
- m_is_pending_string = f.m_is_pending_string;
- m_line_break_enabled = f.m_line_break_enabled;
- return *this;
- }
-
- void set_status(int status, const char* status_name) override {};
- void output_header() override {};
- void output_footer() override {};
- void enable_line_break() override { m_line_break_enabled = true; }
- void flush(std::ostream& os) override;
- using Formatter::flush; // don't hide Formatter::flush(bufferlist &bl)
- void reset() override;
- void open_array_section(std::string_view name) override;
- void open_array_section_in_ns(std::string_view name, const char *ns) override;
- void open_object_section(std::string_view name) override;
- void open_object_section_in_ns(std::string_view name, const char *ns) override;
- void close_section() override;
- void dump_null(std::string_view name) override;
- void dump_unsigned(std::string_view name, uint64_t u) override;
- void dump_int(std::string_view name, int64_t s) override;
- void dump_float(std::string_view name, double d) override;
- void dump_string(std::string_view name, std::string_view s) override;
- std::ostream& dump_stream(std::string_view name) override;
- void dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap) override;
- int get_len() const override;
- void write_raw_data(const char *data) override;
-
-protected:
- virtual bool handle_value(std::string_view name, std::string_view s, bool quoted) {
- return false; /* is handling done? */
- }
-
- virtual bool handle_open_section(std::string_view name, const char *ns, bool is_array) {
- return false; /* is handling done? */
- }
-
- virtual bool handle_close_section() {
- return false; /* is handling done? */
- }
-
- int stack_size() { return m_stack.size(); }
-
- virtual std::ostream& get_ss() {
- return m_ss;
- }
-
- void finish_pending_string();
-
-private:
- struct json_formatter_stack_entry_d {
- int size = 0;
- bool is_array = false;
- };
-
- bool m_pretty = false;
- void open_section(std::string_view name, const char *ns, bool is_array);
- void print_quoted_string(std::string_view s);
- void print_name(std::string_view name);
- void print_comma(json_formatter_stack_entry_d& entry);
- void add_value(std::string_view name, double val);
-
- template <class T>
- void add_value(std::string_view name, T val);
- void add_value(std::string_view name, std::string_view val, bool quoted);
-
- mutable std::stringstream m_ss; // mutable for get_len
- std::stringstream m_pending_string;
- std::string m_pending_name;
- std::vector<json_formatter_stack_entry_d> m_stack;
- bool m_is_pending_string = false;
- bool m_line_break_enabled = false;
- };
-
- class JSONFormatterFile : public JSONFormatter {
-public:
- JSONFormatterFile(const std::string& path, bool pretty=false) :
- JSONFormatter(pretty),
- path(path),
- file(path, std::ios::out | std::ios::trunc)
- {
- }
- ~JSONFormatterFile() {
- flush();
- }
-
- void flush(std::ostream& os) override {
- flush();
- }
- void flush() {
- JSONFormatter::finish_pending_string();
- file.flush();
- }
-
- void reset() override {
- JSONFormatter::reset();
- file = std::ofstream(path, std::ios::out | std::ios::trunc);
- }
- int get_len() const override {
- return file.tellp();
- }
- std::ofstream const& get_ofstream() const {
- return file;
- }
-
-protected:
- std::ostream& get_ss() override {
- return file;
- }
-
-private:
- std::string path;
- mutable std::ofstream file; // mutable for get_len
- };
-
- template <class T>
- void add_value(std::string_view name, T val);
-
- class XMLFormatter : public Formatter {
- public:
- static const char *XML_1_DTD;
- XMLFormatter(bool pretty = false, bool lowercased = false, bool underscored = true);
-
- void set_status(int status, const char* status_name) override {}
- void output_header() override;
- void output_footer() override;
-
- void enable_line_break() override { m_line_break_enabled = true; }
- void flush(std::ostream& os) override;
- using Formatter::flush; // don't hide Formatter::flush(bufferlist &bl)
- void reset() override;
- void open_array_section(std::string_view name) override;
- void open_array_section_in_ns(std::string_view name, const char *ns) override;
- void open_object_section(std::string_view name) override;
- void open_object_section_in_ns(std::string_view name, const char *ns) override;
- void close_section() override;
- void dump_null(std::string_view name) override;
- void dump_unsigned(std::string_view name, uint64_t u) override;
- void dump_int(std::string_view name, int64_t s) override;
- void dump_float(std::string_view name, double d) override;
- void dump_string(std::string_view name, std::string_view s) override;
- std::ostream& dump_stream(std::string_view name) override;
- void dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap) override;
- int get_len() const override;
- void write_raw_data(const char *data) override;
- void write_bin_data(const char* buff, int len) override;
-
- /* with attrs */
- void open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
- void open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
- void dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs) override;
-
- protected:
- void open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs);
- void finish_pending_string();
- void print_spaces();
- void get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const;
- char to_lower_underscore(char c) const;
- std::string get_xml_name(std::string_view name) const;
-
- std::stringstream m_ss, m_pending_string;
- std::deque<std::string> m_sections;
- const bool m_pretty;
- const bool m_lowercased;
- const bool m_underscored;
- std::string m_pending_string_name;
- bool m_header_done;
- bool m_line_break_enabled = false;
- private:
- template <class T>
- void add_value(std::string_view name, T val);
- };
-
- class TableFormatter : public Formatter {
- public:
- explicit TableFormatter(bool keyval = false);
-
- void set_status(int status, const char* status_name) override {};
- void output_header() override {};
- void output_footer() override {};
- void enable_line_break() override {};
- void flush(std::ostream& os) override;
- using Formatter::flush; // don't hide Formatter::flush(bufferlist &bl)
- void reset() override;
- void open_array_section(std::string_view name) override;
- void open_array_section_in_ns(std::string_view name, const char *ns) override;
- void open_object_section(std::string_view name) override;
- void open_object_section_in_ns(std::string_view name, const char *ns) override;
-
- void open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
- void open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
-
- void close_section() override;
- void dump_null(std::string_view name) override;
- void dump_unsigned(std::string_view name, uint64_t u) override;
- void dump_int(std::string_view name, int64_t s) override;
- void dump_float(std::string_view name, double d) override;
- void dump_string(std::string_view name, std::string_view s) override;
- void dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap) override;
- void dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs) override;
- std::ostream& dump_stream(std::string_view name) override;
-
- int get_len() const override;
- void write_raw_data(const char *data) override;
- void get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const;
-
- private:
- template <class T>
- void add_value(std::string_view name, T val);
- void open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs);
- std::vector< std::vector<std::pair<std::string, std::string> > > m_vec;
- std::stringstream m_ss;
- size_t m_vec_index(std::string_view name);
- std::string get_section_name(std::string_view name);
- void finish_pending_string();
- std::string m_pending_name;
- bool m_keyval;
-
- int m_section_open;
- std::vector< std::string > m_section;
- std::map<std::string, int> m_section_cnt;
- std::vector<size_t> m_column_size;
- std::vector< std::string > m_column_name;
- };
-
std::string fixed_to_string(int64_t num, int scale);
std::string fixed_u_to_string(uint64_t num, int scale);
}
#include "HTMLFormatter.h"
#include "Formatter.h"
-#include <sstream>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef CEPH_HTML_FORMATTER_H
#define CEPH_HTML_FORMATTER_H
-#include "Formatter.h"
+#include "XMLFormatter.h"
namespace ceph {
class HTMLFormatter : public XMLFormatter {
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#include "JSONFormatter.h"
+#include "common/escape.h"
+#include "common/StackStringStream.h"
+#include "include/ceph_assert.h"
+
+#include <boost/container/small_vector.hpp>
+
+#include <cmath> // for std::isfinite(), std::isnan()
+#include <limits>
+#include <utility>
+
+#define LARGE_SIZE 1024
+
+namespace ceph {
+
+void JSONFormatter::flush(std::ostream& os)
+{
+ finish_pending_string();
+ os << m_ss.str();
+ if (m_line_break_enabled)
+ os << "\n";
+ m_ss.clear();
+ m_ss.str("");
+}
+
+void JSONFormatter::reset()
+{
+ m_stack.clear();
+ m_ss.clear();
+ m_ss.str("");
+ m_pending_string.clear();
+ m_pending_string.str("");
+}
+
+void JSONFormatter::print_comma(json_formatter_stack_entry_d& entry)
+{
+ auto& ss = get_ss();
+ if (entry.size) {
+ if (m_pretty) {
+ ss << ",\n";
+ for (unsigned i = 1; i < m_stack.size(); i++)
+ ss << " ";
+ } else {
+ ss << ",";
+ }
+ } else if (m_pretty) {
+ ss << "\n";
+ for (unsigned i = 1; i < m_stack.size(); i++)
+ ss << " ";
+ }
+ if (m_pretty && entry.is_array)
+ ss << " ";
+}
+
+void JSONFormatter::print_quoted_string(std::string_view s)
+{
+ auto& ss = get_ss();
+ ss << '\"' << json_stream_escaper(s) << '\"';
+}
+
+void JSONFormatter::print_name(std::string_view name)
+{
+ auto& ss = get_ss();
+ finish_pending_string();
+ if (m_stack.empty())
+ return;
+ struct json_formatter_stack_entry_d& entry = m_stack.back();
+ print_comma(entry);
+ if (!entry.is_array) {
+ if (m_pretty) {
+ ss << " ";
+ }
+ ss << "\"" << name << "\"";
+ if (m_pretty)
+ ss << ": ";
+ else
+ ss << ':';
+ }
+ ++entry.size;
+}
+
+void JSONFormatter::open_section(std::string_view name, const char *ns, bool is_array)
+{
+ auto& ss = get_ss();
+ if (handle_open_section(name, ns, is_array)) {
+ return;
+ }
+ if (ns) {
+ std::ostringstream oss;
+ oss << name << " " << ns;
+ print_name(oss.str().c_str());
+ } else {
+ print_name(name);
+ }
+ if (is_array)
+ ss << '[';
+ else
+ ss << '{';
+
+ json_formatter_stack_entry_d n;
+ n.is_array = is_array;
+ m_stack.push_back(n);
+}
+
+void JSONFormatter::open_array_section(std::string_view name)
+{
+ open_section(name, nullptr, true);
+}
+
+void JSONFormatter::open_array_section_in_ns(std::string_view name, const char *ns)
+{
+ open_section(name, ns, true);
+}
+
+void JSONFormatter::open_object_section(std::string_view name)
+{
+ open_section(name, nullptr, false);
+}
+
+void JSONFormatter::open_object_section_in_ns(std::string_view name, const char *ns)
+{
+ open_section(name, ns, false);
+}
+
+void JSONFormatter::close_section()
+{
+ auto& ss = get_ss();
+ if (handle_close_section()) {
+ return;
+ }
+ ceph_assert(!m_stack.empty());
+ finish_pending_string();
+
+ struct json_formatter_stack_entry_d& entry = m_stack.back();
+ if (m_pretty && entry.size) {
+ ss << "\n";
+ for (unsigned i = 1; i < m_stack.size(); i++)
+ ss << " ";
+ }
+ ss << (entry.is_array ? ']' : '}');
+ m_stack.pop_back();
+ if (m_pretty && m_stack.empty())
+ ss << "\n";
+}
+
+void JSONFormatter::finish_pending_string()
+{
+ if (m_is_pending_string) {
+ m_is_pending_string = false;
+ add_value(m_pending_name.c_str(), m_pending_string.str(), true);
+ m_pending_string.str("");
+ }
+}
+
+void JSONFormatter::add_value(std::string_view name, double val) {
+ CachedStackStringStream css;
+ if (!std::isfinite(val) || std::isnan(val)) {
+ *css << "null";
+ } else {
+ css->precision(std::numeric_limits<double>::max_digits10);
+ *css << val;
+ }
+ add_value(name, css->strv(), false);
+}
+
+template <class T>
+void JSONFormatter::add_value(std::string_view name, T val)
+{
+ CachedStackStringStream css;
+ css->precision(std::numeric_limits<T>::max_digits10);
+ *css << val;
+ add_value(name, css->strv(), false);
+}
+
+void JSONFormatter::add_value(std::string_view name, std::string_view val, bool quoted)
+{
+ auto& ss = get_ss();
+ if (handle_value(name, val, quoted)) {
+ return;
+ }
+ print_name(name);
+ if (!quoted) {
+ ss << val;
+ } else {
+ print_quoted_string(val);
+ }
+}
+
+void JSONFormatter::dump_null(std::string_view name)
+{
+ add_value(name, "null");
+}
+
+void JSONFormatter::dump_unsigned(std::string_view name, uint64_t u)
+{
+ add_value(name, u);
+}
+
+void JSONFormatter::dump_int(std::string_view name, int64_t s)
+{
+ add_value(name, s);
+}
+
+void JSONFormatter::dump_float(std::string_view name, double d)
+{
+ add_value(name, d);
+}
+
+void JSONFormatter::dump_string(std::string_view name, std::string_view s)
+{
+ add_value(name, s, true);
+}
+
+std::ostream& JSONFormatter::dump_stream(std::string_view name)
+{
+ finish_pending_string();
+ m_pending_name = name;
+ m_is_pending_string = true;
+ return m_pending_string;
+}
+
+void JSONFormatter::dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap)
+{
+ auto buf = boost::container::small_vector<char, LARGE_SIZE>{
+ LARGE_SIZE, boost::container::default_init};
+
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
+ int len = vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
+ va_end(ap_copy);
+
+ if (std::cmp_greater_equal(len, buf.size())) {
+ // output was truncated, allocate a buffer large enough
+ buf.resize(len + 1, boost::container::default_init);
+ vsnprintf(buf.data(), buf.size(), fmt, ap);
+ }
+
+ add_value(name, buf.data(), quoted);
+}
+
+int JSONFormatter::get_len() const
+{
+ return m_ss.tellp();
+}
+
+void JSONFormatter::write_raw_data(const char *data)
+{
+ get_ss() << data;
+}
+
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "common/Formatter.h"
+
+#include <sstream>
+#include <vector>
+
+namespace ceph {
+
+ class JSONFormatter : public Formatter {
+ public:
+ explicit JSONFormatter(bool p = false) : m_pretty(p) {}
+ JSONFormatter(const JSONFormatter& f) :
+ m_pretty(f.m_pretty),
+ m_pending_name(f.m_pending_name),
+ m_stack(f.m_stack),
+ m_is_pending_string(f.m_is_pending_string),
+ m_line_break_enabled(f.m_line_break_enabled)
+ {
+ m_ss.str(f.m_ss.str());
+ m_pending_string.str(f.m_pending_string.str());
+ }
+ JSONFormatter(JSONFormatter&& f) :
+ m_pretty(f.m_pretty),
+ m_ss(std::move(f.m_ss)),
+ m_pending_string(std::move(f.m_pending_string)),
+ m_pending_name(f.m_pending_name),
+ m_stack(std::move(f.m_stack)),
+ m_is_pending_string(f.m_is_pending_string),
+ m_line_break_enabled(f.m_line_break_enabled)
+ {
+ }
+ JSONFormatter& operator=(const JSONFormatter& f)
+ {
+ m_pretty = f.m_pretty;
+ m_ss.str(f.m_ss.str());
+ m_pending_string.str(f.m_pending_string.str());
+ m_pending_name = f.m_pending_name;
+ m_stack = f.m_stack;
+ m_is_pending_string = f.m_is_pending_string;
+ m_line_break_enabled = f.m_line_break_enabled;
+ return *this;
+ }
+
+ JSONFormatter& operator=(JSONFormatter&& f)
+ {
+ m_pretty = f.m_pretty;
+ m_ss = std::move(f.m_ss);
+ m_pending_string = std::move(f.m_pending_string);
+ m_pending_name = f.m_pending_name;
+ m_stack = std::move(f.m_stack);
+ m_is_pending_string = f.m_is_pending_string;
+ m_line_break_enabled = f.m_line_break_enabled;
+ return *this;
+ }
+
+ void set_status(int status, const char* status_name) override {};
+ void output_header() override {};
+ void output_footer() override {};
+ void enable_line_break() override { m_line_break_enabled = true; }
+ void flush(std::ostream& os) override;
+ using Formatter::flush; // don't hide Formatter::flush(bufferlist &bl)
+ void reset() override;
+ void open_array_section(std::string_view name) override;
+ void open_array_section_in_ns(std::string_view name, const char *ns) override;
+ void open_object_section(std::string_view name) override;
+ void open_object_section_in_ns(std::string_view name, const char *ns) override;
+ void close_section() override;
+ void dump_null(std::string_view name) override;
+ void dump_unsigned(std::string_view name, uint64_t u) override;
+ void dump_int(std::string_view name, int64_t s) override;
+ void dump_float(std::string_view name, double d) override;
+ void dump_string(std::string_view name, std::string_view s) override;
+ std::ostream& dump_stream(std::string_view name) override;
+ void dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap) override;
+ int get_len() const override;
+ void write_raw_data(const char *data) override;
+
+protected:
+ virtual bool handle_value(std::string_view name, std::string_view s, bool quoted) {
+ return false; /* is handling done? */
+ }
+
+ virtual bool handle_open_section(std::string_view name, const char *ns, bool is_array) {
+ return false; /* is handling done? */
+ }
+
+ virtual bool handle_close_section() {
+ return false; /* is handling done? */
+ }
+
+ int stack_size() { return m_stack.size(); }
+
+ virtual std::ostream& get_ss() {
+ return m_ss;
+ }
+
+ void finish_pending_string();
+
+private:
+ struct json_formatter_stack_entry_d {
+ int size = 0;
+ bool is_array = false;
+ };
+
+ bool m_pretty = false;
+ void open_section(std::string_view name, const char *ns, bool is_array);
+ void print_quoted_string(std::string_view s);
+ void print_name(std::string_view name);
+ void print_comma(json_formatter_stack_entry_d& entry);
+ void add_value(std::string_view name, double val);
+
+ template <class T>
+ void add_value(std::string_view name, T val);
+ void add_value(std::string_view name, std::string_view val, bool quoted);
+
+ mutable std::stringstream m_ss; // mutable for get_len
+ std::stringstream m_pending_string;
+ std::string m_pending_name;
+ std::vector<json_formatter_stack_entry_d> m_stack;
+ bool m_is_pending_string = false;
+ bool m_line_break_enabled = false;
+ };
+
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "JSONFormatter.h"
+
+#include <fstream>
+
+namespace ceph {
+
+ class JSONFormatterFile : public JSONFormatter {
+public:
+ JSONFormatterFile(const std::string& path, bool pretty=false) :
+ JSONFormatter(pretty),
+ path(path),
+ file(path, std::ios::out | std::ios::trunc)
+ {
+ }
+ ~JSONFormatterFile() {
+ flush();
+ }
+
+ void flush(std::ostream& os) override {
+ flush();
+ }
+ void flush() {
+ JSONFormatter::finish_pending_string();
+ file.flush();
+ }
+
+ void reset() override {
+ JSONFormatter::reset();
+ file = std::ofstream(path, std::ios::out | std::ios::trunc);
+ }
+ int get_len() const override {
+ return file.tellp();
+ }
+ std::ofstream const& get_ofstream() const {
+ return file;
+ }
+
+protected:
+ std::ostream& get_ss() override {
+ return file;
+ }
+
+private:
+ std::string path;
+ mutable std::ofstream file; // mutable for get_len
+ };
+
+}
+
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#include "TableFormatter.h"
+#include "common/escape.h"
+#include "common/StackStringStream.h"
+#include "include/buffer.h"
+
+#include <boost/container/small_vector.hpp>
+#include <fmt/format.h>
+
+#include <algorithm>
+#include <set>
+#include <limits>
+#include <utility>
+
+#define LARGE_SIZE 1024
+
+namespace ceph {
+
+TableFormatter::TableFormatter(bool keyval) : m_keyval(keyval)
+{
+ reset();
+}
+
+void TableFormatter::flush(std::ostream& os)
+{
+ finish_pending_string();
+ std::vector<size_t> column_size = m_column_size;
+ std::vector<std::string> column_name = m_column_name;
+
+ std::set<int> need_header_set;
+
+ // auto-sizing columns
+ for (size_t i = 0; i < m_vec.size(); i++) {
+ for (size_t j = 0; j < m_vec[i].size(); j++) {
+ column_size.resize(m_vec[i].size());
+ column_name.resize(m_vec[i].size());
+ if (i > 0) {
+ if (m_vec[i - 1][j] != m_vec[i][j]) {
+ // changing row labels require to show the header
+ need_header_set.insert(i);
+ column_name[i] = m_vec[i][j].first;
+ }
+ } else {
+ column_name[i] = m_vec[i][j].first;
+ }
+
+ if (m_vec[i][j].second.length() > column_size[j])
+ column_size[j] = m_vec[i][j].second.length();
+ if (m_vec[i][j].first.length() > column_size[j])
+ column_size[j] = m_vec[i][j].first.length();
+ }
+ }
+
+ bool need_header = false;
+ if ((column_size.size() == m_column_size.size())) {
+ for (size_t i = 0; i < column_size.size(); i++) {
+ if (column_size[i] != m_column_size[i]) {
+ need_header = true;
+ break;
+ }
+ }
+ } else {
+ need_header = true;
+ }
+
+ if (need_header) {
+ // first row always needs a header if there wasn't one before
+ need_header_set.insert(0);
+ }
+
+ m_column_size = column_size;
+ for (size_t i = 0; i < m_vec.size(); i++) {
+ if (i == 0) {
+ if (need_header_set.count(i)) {
+ // print the header
+ if (!m_keyval) {
+ os << "+";
+ for (size_t j = 0; j < m_vec[i].size(); j++) {
+ for (size_t v = 0; v < m_column_size[j] + 3; v++)
+ os << "-";
+ os << "+";
+ }
+ os << "\n";
+ os << "|";
+
+ for (size_t j = 0; j < m_vec[i].size(); j++) {
+ os << fmt::format(" {:<{}}|",
+ m_vec[i][j].first, m_column_size[j] + 2);
+ }
+ os << "\n";
+ os << "+";
+ for (size_t j = 0; j < m_vec[i].size(); j++) {
+ for (size_t v = 0; v < m_column_size[j] + 3; v++)
+ os << "-";
+ os << "+";
+ }
+ os << "\n";
+ }
+ }
+ }
+ // print body
+ if (!m_keyval)
+ os << "|";
+ for (size_t j = 0; j < m_vec[i].size(); j++) {
+ if (!m_keyval)
+ os << " ";
+ if (m_keyval) {
+ os << "key::";
+ os << m_vec[i][j].first;
+ os << "=";
+ os << "\"";
+ os << m_vec[i][j].second;
+ os << "\" ";
+ } else {
+ os << fmt::format("{:<{}}|", m_vec[i][j].second, m_column_size[j] + 2);
+ }
+ }
+
+ os << "\n";
+ if (!m_keyval) {
+ if (i == (m_vec.size() - 1)) {
+ // print trailer
+ os << "+";
+ for (size_t j = 0; j < m_vec[i].size(); j++) {
+ for (size_t v = 0; v < m_column_size[j] + 3; v++)
+ os << "-";
+ os << "+";
+ }
+ os << "\n";
+ }
+ }
+ m_vec[i].clear();
+ }
+ m_vec.clear();
+}
+
+void TableFormatter::reset()
+{
+ m_ss.clear();
+ m_ss.str("");
+ m_section_cnt.clear();
+ m_column_size.clear();
+ m_section_open = 0;
+}
+
+void TableFormatter::open_object_section(std::string_view name)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void TableFormatter::open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void TableFormatter::open_object_section_in_ns(std::string_view name, const char *ns)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void TableFormatter::open_array_section(std::string_view name)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void TableFormatter::open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void TableFormatter::open_array_section_in_ns(std::string_view name, const char *ns)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void TableFormatter::open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs)
+{
+ m_section.push_back(std::string(name));
+ m_section_open++;
+}
+
+void TableFormatter::close_section()
+{
+ //
+ m_section_open--;
+ if (m_section.size()) {
+ m_section_cnt[m_section.back()] = 0;
+ m_section.pop_back();
+ }
+}
+
+size_t TableFormatter::m_vec_index(std::string_view name)
+{
+ std::string key(name);
+
+ size_t i = m_vec.size();
+ if (i)
+ i--;
+
+ // make sure there are vectors to push back key/val pairs
+ if (!m_vec.size())
+ m_vec.resize(1);
+
+ if (m_vec.size()) {
+ if (m_vec[i].size()) {
+ if (m_vec[i][0].first == key) {
+ // start a new column if a key is repeated
+ m_vec.resize(m_vec.size() + 1);
+ i++;
+ }
+ }
+ }
+
+ return i;
+}
+
+std::string TableFormatter::get_section_name(std::string_view name)
+{
+ std::string t_name{name};
+ for (const auto &i : m_section) {
+ t_name.insert(0, ":");
+ t_name.insert(0, i);
+ }
+ if (m_section_open) {
+ std::stringstream lss;
+ lss << t_name;
+ lss << "[";
+ lss << m_section_cnt[t_name]++;
+ lss << "]";
+ return lss.str();
+ } else {
+ return t_name;
+ }
+}
+
+template <class T>
+void TableFormatter::add_value(std::string_view name, T val) {
+ finish_pending_string();
+ size_t i = m_vec_index(name);
+ m_ss.precision(std::numeric_limits<double>::max_digits10);
+ m_ss << val;
+
+ m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
+ m_ss.clear();
+ m_ss.str("");
+}
+
+void TableFormatter::dump_null(std::string_view name)
+{
+ add_value(name, "null");
+}
+
+void TableFormatter::dump_unsigned(std::string_view name, uint64_t u)
+{
+ add_value(name, u);
+}
+
+void TableFormatter::dump_int(std::string_view name, int64_t s)
+{
+ add_value(name, s);
+}
+
+void TableFormatter::dump_float(std::string_view name, double d)
+{
+ add_value(name, d);
+}
+
+void TableFormatter::dump_string(std::string_view name, std::string_view s)
+{
+ finish_pending_string();
+ size_t i = m_vec_index(name);
+ m_ss << s;
+
+ m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
+ m_ss.clear();
+ m_ss.str("");
+}
+
+void TableFormatter::dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs)
+{
+ finish_pending_string();
+ size_t i = m_vec_index(name);
+
+ std::string attrs_str;
+ get_attrs_str(&attrs, attrs_str);
+ m_ss << attrs_str << s;
+
+ m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
+ m_ss.clear();
+ m_ss.str("");
+}
+
+void TableFormatter::dump_format_va(std::string_view name,
+ const char *ns, bool quoted,
+ const char *fmt, va_list ap)
+{
+ finish_pending_string();
+ auto buf = boost::container::small_vector<char, LARGE_SIZE>{
+ LARGE_SIZE, boost::container::default_init};
+
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
+ int len = vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
+ va_end(ap_copy);
+
+ if (std::cmp_greater_equal(len, buf.size())) {
+ // output was truncated, allocate a buffer large enough
+ buf.resize(len + 1, boost::container::default_init);
+ vsnprintf(buf.data(), buf.size(), fmt, ap);
+ }
+
+ size_t i = m_vec_index(name);
+ if (ns) {
+ m_ss << ns << "." << buf.data();
+ } else {
+ m_ss << buf.data();
+ }
+
+ m_vec[i].push_back(std::make_pair(get_section_name(name), m_ss.str()));
+ m_ss.clear();
+ m_ss.str("");
+}
+
+std::ostream& TableFormatter::dump_stream(std::string_view name)
+{
+ finish_pending_string();
+ // we don't support this
+ m_pending_name = name;
+ return m_ss;
+}
+
+int TableFormatter::get_len() const
+{
+ // we don't know the size until flush is called
+ return 0;
+}
+
+void TableFormatter::write_raw_data(const char *data) {
+ // not supported
+}
+
+void TableFormatter::get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const
+{
+ CachedStackStringStream css;
+
+ for (const auto &p : attrs->attrs) {
+ *css << " " << p.first << "=" << "\"" << p.second << "\"";
+ }
+
+ attrs_str = css->strv();
+}
+
+void TableFormatter::finish_pending_string()
+{
+ if (m_pending_name.length()) {
+ std::string ss = m_ss.str();
+ m_ss.clear();
+ m_ss.str("");
+ std::string pending_name = m_pending_name;
+ m_pending_name = "";
+ dump_string(pending_name.c_str(), ss);
+ }
+}
+
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "common/Formatter.h"
+
+#include <memory>
+#include <vector>
+#include <sstream>
+#include <map>
+
+namespace ceph {
+
+ class TableFormatter : public Formatter {
+ public:
+ explicit TableFormatter(bool keyval = false);
+
+ void set_status(int status, const char* status_name) override {};
+ void output_header() override {};
+ void output_footer() override {};
+ void enable_line_break() override {};
+ void flush(std::ostream& os) override;
+ using Formatter::flush; // don't hide Formatter::flush(bufferlist &bl)
+ void reset() override;
+ void open_array_section(std::string_view name) override;
+ void open_array_section_in_ns(std::string_view name, const char *ns) override;
+ void open_object_section(std::string_view name) override;
+ void open_object_section_in_ns(std::string_view name, const char *ns) override;
+
+ void open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
+ void open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
+
+ void close_section() override;
+ void dump_null(std::string_view name) override;
+ void dump_unsigned(std::string_view name, uint64_t u) override;
+ void dump_int(std::string_view name, int64_t s) override;
+ void dump_float(std::string_view name, double d) override;
+ void dump_string(std::string_view name, std::string_view s) override;
+ void dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap) override;
+ void dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs) override;
+ std::ostream& dump_stream(std::string_view name) override;
+
+ int get_len() const override;
+ void write_raw_data(const char *data) override;
+ void get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const;
+
+ private:
+ template <class T>
+ void add_value(std::string_view name, T val);
+ void open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs);
+ std::vector< std::vector<std::pair<std::string, std::string> > > m_vec;
+ std::stringstream m_ss;
+ size_t m_vec_index(std::string_view name);
+ std::string get_section_name(std::string_view name);
+ void finish_pending_string();
+ std::string m_pending_name;
+ bool m_keyval;
+
+ int m_section_open;
+ std::vector< std::string > m_section;
+ std::map<std::string, int> m_section_cnt;
+ std::vector<size_t> m_column_size;
+ std::vector< std::string > m_column_name;
+ };
+
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#include "XMLFormatter.h"
+#include "common/escape.h"
+#include "common/StackStringStream.h"
+#include "include/ceph_assert.h"
+
+#include <boost/container/small_vector.hpp>
+
+#include <algorithm>
+#include <limits>
+#include <utility>
+
+#define LARGE_SIZE 1024
+
+namespace ceph {
+
+const char *XMLFormatter::XML_1_DTD =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+
+XMLFormatter::XMLFormatter(bool pretty, bool lowercased, bool underscored)
+: m_pretty(pretty),
+ m_lowercased(lowercased),
+ m_underscored(underscored)
+{
+ reset();
+}
+
+void XMLFormatter::flush(std::ostream& os)
+{
+ finish_pending_string();
+ std::string m_ss_str = m_ss.str();
+ os << m_ss_str;
+ /* There is a small catch here. If the rest of the formatter had NO output,
+ * we should NOT output a newline. This primarily triggers on HTTP redirects */
+ if (m_pretty && !m_ss_str.empty())
+ os << "\n";
+ else if (m_line_break_enabled)
+ os << "\n";
+ m_ss.clear();
+ m_ss.str("");
+}
+
+void XMLFormatter::reset()
+{
+ m_ss.clear();
+ m_ss.str("");
+ m_pending_string.clear();
+ m_pending_string.str("");
+ m_sections.clear();
+ m_pending_string_name.clear();
+ m_header_done = false;
+}
+
+void XMLFormatter::output_header()
+{
+ if(!m_header_done) {
+ m_header_done = true;
+ write_raw_data(XMLFormatter::XML_1_DTD);
+ if (m_pretty)
+ m_ss << "\n";
+ }
+}
+
+void XMLFormatter::output_footer()
+{
+ while(!m_sections.empty()) {
+ close_section();
+ }
+}
+
+void XMLFormatter::open_object_section(std::string_view name)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void XMLFormatter::open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
+{
+ open_section_in_ns(name, NULL, &attrs);
+}
+
+void XMLFormatter::open_object_section_in_ns(std::string_view name, const char *ns)
+{
+ open_section_in_ns(name, ns, NULL);
+}
+
+void XMLFormatter::open_array_section(std::string_view name)
+{
+ open_section_in_ns(name, NULL, NULL);
+}
+
+void XMLFormatter::open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs)
+{
+ open_section_in_ns(name, NULL, &attrs);
+}
+
+void XMLFormatter::open_array_section_in_ns(std::string_view name, const char *ns)
+{
+ open_section_in_ns(name, ns, NULL);
+}
+
+std::string XMLFormatter::get_xml_name(std::string_view name) const
+{
+ std::string e(name);
+ std::transform(e.begin(), e.end(), e.begin(),
+ [this](char c) { return this->to_lower_underscore(c); });
+ return e;
+}
+
+void XMLFormatter::close_section()
+{
+ ceph_assert(!m_sections.empty());
+ finish_pending_string();
+
+ auto section = get_xml_name(m_sections.back());
+ m_sections.pop_back();
+ print_spaces();
+ m_ss << "</" << section << ">";
+ if (m_pretty)
+ m_ss << "\n";
+}
+
+template <class T>
+void XMLFormatter::add_value(std::string_view name, T val)
+{
+ auto e = get_xml_name(name);
+ print_spaces();
+ m_ss.precision(std::numeric_limits<T>::max_digits10);
+ m_ss << "<" << e << ">" << val << "</" << e << ">";
+ if (m_pretty)
+ m_ss << "\n";
+}
+
+void XMLFormatter::dump_null(std::string_view name)
+{
+ print_spaces();
+ m_ss << "<" << get_xml_name(name) << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\" />";
+ if (m_pretty)
+ m_ss << "\n";
+}
+
+void XMLFormatter::dump_unsigned(std::string_view name, uint64_t u)
+{
+ add_value(name, u);
+}
+
+void XMLFormatter::dump_int(std::string_view name, int64_t s)
+{
+ add_value(name, s);
+}
+
+void XMLFormatter::dump_float(std::string_view name, double d)
+{
+ add_value(name, d);
+}
+
+void XMLFormatter::dump_string(std::string_view name, std::string_view s)
+{
+ auto e = get_xml_name(name);
+ print_spaces();
+ m_ss << "<" << e << ">" << xml_stream_escaper(s) << "</" << e << ">";
+ if (m_pretty)
+ m_ss << "\n";
+}
+
+void XMLFormatter::dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs)
+{
+ auto e = get_xml_name(name);
+ std::string attrs_str;
+ get_attrs_str(&attrs, attrs_str);
+ print_spaces();
+ m_ss << "<" << e << attrs_str << ">" << xml_stream_escaper(s) << "</" << e << ">";
+ if (m_pretty)
+ m_ss << "\n";
+}
+
+std::ostream& XMLFormatter::dump_stream(std::string_view name)
+{
+ print_spaces();
+ m_pending_string_name = name;
+ m_ss << "<" << m_pending_string_name << ">";
+ return m_pending_string;
+}
+
+void XMLFormatter::dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap)
+{
+ auto buf = boost::container::small_vector<char, LARGE_SIZE>{
+ LARGE_SIZE, boost::container::default_init};
+
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
+ int len = vsnprintf(buf.data(), buf.size(), fmt, ap_copy);
+ va_end(ap_copy);
+
+ if (std::cmp_greater_equal(len, buf.size())) {
+ // output was truncated, allocate a buffer large enough
+ buf.resize(len + 1, boost::container::default_init);
+ vsnprintf(buf.data(), buf.size(), fmt, ap);
+ }
+
+ auto e = get_xml_name(name);
+
+ print_spaces();
+ if (ns) {
+ m_ss << "<" << e << " xmlns=\"" << ns << "\">" << xml_stream_escaper(std::string_view(buf.data(), len)) << "</" << e << ">";
+ } else {
+ m_ss << "<" << e << ">" << xml_stream_escaper(std::string_view(buf.data(), len)) << "</" << e << ">";
+ }
+
+ if (m_pretty)
+ m_ss << "\n";
+}
+
+int XMLFormatter::get_len() const
+{
+ return m_ss.str().size();
+}
+
+void XMLFormatter::write_raw_data(const char *data)
+{
+ m_ss << data;
+}
+
+void XMLFormatter::write_bin_data(const char* buff, int buf_len)
+{
+ std::stringbuf *pbuf = m_ss.rdbuf();
+ pbuf->sputn(buff, buf_len);
+ m_ss.seekg(buf_len);
+}
+
+void XMLFormatter::get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const
+{
+ CachedStackStringStream css;
+
+ for (const auto &p : attrs->attrs) {
+ *css << " " << p.first << "=" << "\"" << p.second << "\"";
+ }
+
+ attrs_str = css->strv();
+}
+
+void XMLFormatter::open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs)
+{
+ print_spaces();
+ std::string attrs_str;
+
+ if (attrs) {
+ get_attrs_str(attrs, attrs_str);
+ }
+
+ auto e = get_xml_name(name);
+
+ if (ns) {
+ m_ss << "<" << e << attrs_str << " xmlns=\"" << ns << "\">";
+ } else {
+ m_ss << "<" << e << attrs_str << ">";
+ }
+ if (m_pretty)
+ m_ss << "\n";
+ m_sections.push_back(std::string(name));
+}
+
+void XMLFormatter::finish_pending_string()
+{
+ if (!m_pending_string_name.empty()) {
+ m_ss << xml_stream_escaper(m_pending_string.str())
+ << "</" << m_pending_string_name << ">";
+ m_pending_string_name.clear();
+ m_pending_string.str(std::string());
+ if (m_pretty) {
+ m_ss << "\n";
+ }
+ }
+}
+
+void XMLFormatter::print_spaces()
+{
+ finish_pending_string();
+ if (m_pretty) {
+ std::string spaces(m_sections.size(), ' ');
+ m_ss << spaces;
+ }
+}
+
+char XMLFormatter::to_lower_underscore(char c) const
+{
+ if (m_underscored && c == ' ') {
+ return '_';
+ } else if (m_lowercased) {
+ return std::tolower(c);
+ }
+ return c;
+}
+
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "common/Formatter.h"
+
+#include <deque>
+#include <sstream>
+
+namespace ceph {
+
+ class XMLFormatter : public Formatter {
+ public:
+ static const char *XML_1_DTD;
+ XMLFormatter(bool pretty = false, bool lowercased = false, bool underscored = true);
+
+ void set_status(int status, const char* status_name) override {}
+ void output_header() override;
+ void output_footer() override;
+
+ void enable_line_break() override { m_line_break_enabled = true; }
+ void flush(std::ostream& os) override;
+ using Formatter::flush; // don't hide Formatter::flush(bufferlist &bl)
+ void reset() override;
+ void open_array_section(std::string_view name) override;
+ void open_array_section_in_ns(std::string_view name, const char *ns) override;
+ void open_object_section(std::string_view name) override;
+ void open_object_section_in_ns(std::string_view name, const char *ns) override;
+ void close_section() override;
+ void dump_null(std::string_view name) override;
+ void dump_unsigned(std::string_view name, uint64_t u) override;
+ void dump_int(std::string_view name, int64_t s) override;
+ void dump_float(std::string_view name, double d) override;
+ void dump_string(std::string_view name, std::string_view s) override;
+ std::ostream& dump_stream(std::string_view name) override;
+ void dump_format_va(std::string_view name, const char *ns, bool quoted, const char *fmt, va_list ap) override;
+ int get_len() const override;
+ void write_raw_data(const char *data) override;
+ void write_bin_data(const char* buff, int len) override;
+
+ /* with attrs */
+ void open_array_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
+ void open_object_section_with_attrs(std::string_view name, const FormatterAttrs& attrs) override;
+ void dump_string_with_attrs(std::string_view name, std::string_view s, const FormatterAttrs& attrs) override;
+
+ protected:
+ void open_section_in_ns(std::string_view name, const char *ns, const FormatterAttrs *attrs);
+ void finish_pending_string();
+ void print_spaces();
+ void get_attrs_str(const FormatterAttrs *attrs, std::string& attrs_str) const;
+ char to_lower_underscore(char c) const;
+ std::string get_xml_name(std::string_view name) const;
+
+ std::stringstream m_ss, m_pending_string;
+ std::deque<std::string> m_sections;
+ const bool m_pretty;
+ const bool m_lowercased;
+ const bool m_underscored;
+ std::string m_pending_string_name;
+ bool m_header_done;
+ bool m_line_break_enabled = false;
+ private:
+ template <class T>
+ void add_value(std::string_view name, T val);
+ };
+
+}
#include "common/admin_socket_client.h"
#include "common/dout.h"
#include "common/errno.h"
+#include "common/JSONFormatterFile.h"
#include "common/safe_io.h"
#include "common/Thread.h"
#include "common/version.h"
#include "json_spirit/json_spirit.h"
-#include "Formatter.h"
+#include "JSONFormatter.h"
${PROJECT_SOURCE_DIR}/src/common/DecayCounter.cc
${PROJECT_SOURCE_DIR}/src/common/HTMLFormatter.cc
${PROJECT_SOURCE_DIR}/src/common/Formatter.cc
+ ${PROJECT_SOURCE_DIR}/src/common/JSONFormatter.cc
+ ${PROJECT_SOURCE_DIR}/src/common/TableFormatter.cc
+ ${PROJECT_SOURCE_DIR}/src/common/XMLFormatter.cc
${PROJECT_SOURCE_DIR}/src/common/Graylog.cc
${PROJECT_SOURCE_DIR}/src/common/Journald.cc
${PROJECT_SOURCE_DIR}/src/common/ostream_temp.cc
#include <fmt/format.h>
#include <fmt/ostream.h>
+#include "common/JSONFormatter.h"
#include "common/safe_io.h"
#include "os/Transaction.h"
#include <seastar/core/metrics.hh>
#include <seastar/core/shared_mutex.hh>
+#include "common/JSONFormatter.h"
#include "common/safe_io.h"
#include "include/stringify.h"
#include "os/Transaction.h"
#include <seastar/core/thread.hh>
#include <seastar/util/defer.hh>
+#include "common/JSONFormatter.h"
#include "crimson/common/config_proxy.h"
#include "crimson/common/coroutine.h"
#include "crimson/common/log.h"
#include "common/Clock.h" // for ceph_clock_now()
#include "common/BackTrace.h"
#include "common/debug.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/safe_io.h"
#include "common/version.h"
#include "include/rados/librados.hpp"
#include "common/Clock.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/ceph_argparse.h"
#include "common/ceph_mutex.h"
#include "common/common_init.h"
#include "common/debug.h"
#include "common/errno.h"
#include "common/fair_mutex.h"
+#include "common/JSONFormatterFile.h"
#include "common/likely.h"
#include "common/Timer.h"
#include "common/async/blocked_completion.h"
#include "RetryMessage.h"
#include "SnapRealm.h"
#include "common/debug.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "mds/MDLog.h"
#include "mds/MDSRank.h"
#include "mds/MDCache.h"
#include "mon/MonClient.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/version.h"
#include "mgr/Types.h"
*/
#include "mgr/ClusterState.h"
+#include "common/JSONFormatter.h"
#include "messages/MMgrDigest.h"
#include "messages/MMonMgrReport.h"
#include "messages/MPGStats.h"
#include "messages/MOSDScrub2.h"
#include "messages/MOSDForceRecovery.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/pick_address.h"
#include "common/TextTable.h"
#include "crush/CrushWrapper.h"
#include <memory>
#include <list>
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "include/ceph_assert.h"
class PyFormatter : public ceph::Formatter
#include "include/stringify.h"
#include "common/BackTrace.h"
+#include "common/JSONFormatter.h"
#include "global/signal_handler.h"
#include "common/debug.h"
using ceph::decode;
using ceph::encode;
using ceph::Formatter;
-using ceph::JSONFormatter;
using ceph::mono_clock;
using ceph::mono_time;
using ceph::timespan_str;
#include "messages/MConfig.h"
#include "messages/MGetConfig.h"
#include "messages/MMonCommand.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/TextTable.h"
#include "common/cmdparse.h"
#include "include/stringify.h"
using ceph::decode;
using ceph::encode;
using ceph::Formatter;
-using ceph::JSONFormatter;
using ceph::mono_clock;
using ceph::mono_time;
using ceph::timespan_str;
using ceph::bufferlist;
using ceph::decode;
using ceph::encode;
-using ceph::Formatter;
-using ceph::JSONFormatter;
using ceph::mono_clock;
using ceph::mono_time;
using ceph::timespan_str;
using ceph::decode;
using ceph::encode;
using ceph::Formatter;
-using ceph::JSONFormatter;
using ceph::make_message;
using ceph::mono_clock;
using ceph::mono_time;
#include "kv/KeyValueDB.h"
#include "include/ceph_assert.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/Finisher.h"
#include "common/errno.h"
#include "common/debug.h"
#include "messages/MMonGetPurgedSnaps.h"
#include "messages/MMonGetPurgedSnapsReply.h"
+#include "common/JSONFormatter.h"
#include "common/TextTable.h"
#include "common/Timer.h"
#include "common/ceph_argparse.h"
#include "include/buffer.h"
#include "msg/msg_types.h"
#include "include/Context.h"
+#include "common/JSONFormatter.h"
#include "common/perf_counters.h"
#include <errno.h>
#include "common/Clock.h" // for ceph_clock_now()
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/perf_counters.h"
#include "Allocator.h"
#include "include/buffer_fwd.h"
#include "include/util.h"
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/safe_io.h"
#include "common/PriorityCache.h"
#include "common/url_escape.h"
#include "common/ceph_argparse.h"
#include "include/stringify.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/safe_io.h"
#include "os/bluestore/BlueFS.h"
#include "common/debug.h"
#include "common/errno.h"
#include "common/safe_io.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/pretty_binary.h"
#include <shared_mutex> // for std::shared_lock
#include "include/stringify.h"
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "MemStore.h"
#include "include/compat.h"
}
#include "common/ceph_context.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/StackStringStream.h"
#include "include/utime_fmt.h"
#include "OSDMap.h"
#include "Replayer.hpp"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "include/scope_guard.h"
#include "rbd_replay/ActionTypes.h"
#include "rbd_replay/BufferReader.h"
#include <boost/shared_ptr.hpp>
#include "include/rbd/librbd.hpp"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "rbd_replay/ActionTypes.h"
#include "rbd_loc.hpp"
#include <iostream>
// vim: ts=8 sw=2 smarttab ft=cpp
#include "common/Clock.h" // for ceph_clock_now()
+#include "common/JSONFormatter.h"
#include "include/function2.hpp"
#include "rgw_acl_s3.h"
#include "rgw_tag_s3.h"
#include <iostream>
#include <map>
-#include "common/Formatter.h"
+#include "common/XMLFormatter.h"
#include <common/errno.h>
#include "rgw_lc.h"
#include "rgw_lc_tier.h"
#include <curl/curl.h>
#include "common/Formatter.h"
#include "common/iso_8601.h"
+#include "common/JSONFormatter.h"
#include "common/async/completion.h"
#include "common/async/yield_waiter.h"
#include "common/async/waiter.h"
// vim: ts=8 sw=2 smarttab ft=cpp
#include "common/errno.h"
+#include "common/JSONFormatter.h"
+#include "common/XMLFormatter.h"
#include "rgw_common.h"
#include "rgw_coroutine.h"
#include "common/debug.h"
#include "common/ceph_json.h"
+#include "common/JSONFormatter.h"
#include "rgw_sync_trace.h"
#include "rgw_rados.h"
#include "common/ceph_json.h"
#include "common/config.h"
#include "common/ceph_argparse.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
+#include "common/XMLFormatter.h"
#include "common/errno.h"
#include "common/safe_io.h"
#include "common/fault_injector.h"
#include <iostream>
#include <map>
+#include "common/XMLFormatter.h"
#include "include/types.h"
#include "rgw_cors_s3.h"
#include <iosfwd>
#include <include/types.h>
-#include <common/Formatter.h>
+#include <common/XMLFormatter.h>
#include <common/dout.h>
#include "rgw_xml.h"
#include "rgw_cors.h"
#include <boost/format.hpp>
#include "common/escape.h"
-#include "common/Formatter.h"
+#include "common/XMLFormatter.h"
#include "rgw/rgw_common.h"
#include "rgw/rgw_formats.h"
#include "rgw/rgw_rest.h"
#include "common/dout.h"
#include "include/scope_guard.h"
+#include "common/XMLFormatter.h"
#include "common/Clock.h"
#include "common/armor.h"
#include "common/async/spawn_throttle.h"
#include <boost/algorithm/string.hpp>
#include <boost/tokenizer.hpp>
#include "ceph_ver.h"
-#include "common/Formatter.h"
#include "common/HTMLFormatter.h"
+#include "common/XMLFormatter.h"
#include "common/utf8.h"
#include "include/str_list.h"
#include "rgw_common.h"
#include "common/admin_socket.h"
#include "common/admin_socket_client.h"
#include "common/ceph_argparse.h"
+#include "common/JSONFormatter.h"
#include "json_spirit/json_spirit.h"
#include "gtest/gtest.h"
#include "fmt/format.h"
#include "common/ceph_json.h"
#include "common/Clock.h"
+#include "common/JSONFormatter.h"
#include "common/StackStringStream.h"
#include <sstream>
#include "gtest/gtest.h"
-#include "common/Formatter.h"
+#include "common/TableFormatter.h"
#include <iostream>
#include <sstream>
#include <string>
#include "gtest/gtest.h"
-#include "common/Formatter.h"
+#include "common/XMLFormatter.h"
#include <sstream>
#include <string>
#include "common/ceph_argparse.h"
#include "common/common_init.h"
+#include "common/JSONFormatter.h"
#include "include/stringify.h"
#include "crush/CrushWrapper.h"
*/
#include "gtest/gtest.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/HTMLFormatter.h"
+#include "common/XMLFormatter.h"
#include <sstream>
#include <string>
#include "include/stringify.h"
#include "common/ceph_context.h"
#include "common/config_proxy.h"
+#include "common/JSONFormatter.h"
#include "json_spirit/json_spirit.h"
#include "boost/format/alt_sstream.hpp"
#include <errno.h>
#include "include/rados/librados.hpp"
#include "include/stringify.h"
#include "common/config_proxy.h"
+#include "common/JSONFormatter.h"
#include "test/librados/test.h"
#include "test/librados/TestCase.h"
#ifndef _WIN32
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "include/ceph_assert.h"
#include "include/stringify.h"
#include "json_spirit/json_spirit.h"
#include "common/debug.h"
#include "common/errno.h"
#include "common/ceph_mutex.h"
+#include "common/JSONFormatter.h"
#include "common/strtol.h"
#include "common/LogEntry.h"
#include "auth/KeyRing.h"
#include "common/Cond.h"
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/options.h" // for the size literals
#include "common/pretty_binary.h"
#include "include/stringify.h"
// vim: ts=8 sw=2 smarttab
#include "rgw_xml.h"
+#include "common/XMLFormatter.h"
+
#include <gtest/gtest.h>
#include <list>
#include <stdexcept>
#include "global/global_init.h"
#include "common/ceph_argparse.h"
+#include "common/TableFormatter.h"
#include "global/global_context.h"
#include "gtest/gtest.h"
#include "include/btree_map.h"
#include "common/ceph_argparse.h"
#include "global/global_init.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/debug.h"
#include "common/errno.h"
#include "client/Inode.h"
#include "ceph_ver.h"
#include "include/types.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/ceph_argparse.h"
#include "common/errno.h"
#include "denc_plugin.h"
#include "auth/KeyRing.h"
#include "auth/cephx/CephxKeyServer.h"
#include "global/global_init.h"
+#include "common/JSONFormatter.h"
#include "include/scope_guard.h"
#include "include/stringify.h"
#include "mgr/mgr_commands.h"
#include <fstream>
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "mds/mdstypes.h"
#include "mds/events/EUpdate.h"
#include "mds/LogEvent.h"
#include "common/ceph_argparse.h"
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "osdc/Journaler.h"
#include "mds/mdstypes.h"
#include "mds/LogEvent.h"
#include "common/ceph_argparse.h"
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "mds/SessionMap.h"
#include "mds/InoTable.h"
#include "ServiceDaemon.h"
#include "common/debug.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/Timer.h"
#include "include/Context.h"
#include "include/stringify.h"
#include "common/ceph_argparse.h"
#include "common/errno.h"
+#include "common/JSONFormatter.h"
#include "common/safe_io.h"
#include "common/strtol.h" // for strict_strtoll()
#include "crush/CrushWrapper.h"
#include "common/Cond.h"
#include "common/debug.h"
#include "common/errno.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/obj_bencher.h"
#include "common/strtol.h" // for strict_strtoll()
#include "common/TextTable.h"
#include "include/rbd/features.h"
#include "common/config_proxy.h"
#include "common/strtol.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
+#include "common/XMLFormatter.h"
#include "global/global_context.h"
#include <iostream>
#include <boost/tokenizer.hpp>
#include "tools/rbd/Shell.h"
#include "tools/rbd/Utils.h"
#include "common/Cond.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/ceph_json.h"
#include "common/errno.h"
#include "common/safe_io.h"
#include <boost/algorithm/string/predicate.hpp>
#include <regex>
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
+#include "common/XMLFormatter.h"
#include "common/Preforker.h"
#include "common/TextTable.h"
#include "common/ceph_argparse.h"
#include "common/config.h"
#include "common/debug.h"
#include "common/errno.h"
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
#include "common/Timer.h"
#include "tools/rbd_mirror/Threads.h"
#include <sstream>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/lexical_cast.hpp>
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
+#include "common/XMLFormatter.h"
#include "common/Preforker.h"
#include "common/SubProcess.h"
#include "common/TextTable.h"
#include <memory>
#include <regex>
-#include "common/Formatter.h"
+#include "common/JSONFormatter.h"
+#include "common/XMLFormatter.h"
#include "common/TextTable.h"
#include "common/ceph_argparse.h"
#include "common/config.h"