PoC prometheus exporter implementation
This commit is contained in:
parent
9f80f6d64d
commit
8845b7133c
@ -9,6 +9,7 @@
|
|||||||
#include "engine/api/trip_parameters.hpp"
|
#include "engine/api/trip_parameters.hpp"
|
||||||
#include "engine/datafacade_provider.hpp"
|
#include "engine/datafacade_provider.hpp"
|
||||||
#include "engine/engine_config.hpp"
|
#include "engine/engine_config.hpp"
|
||||||
|
#include "engine/engine_info.hpp"
|
||||||
#include "engine/plugins/match.hpp"
|
#include "engine/plugins/match.hpp"
|
||||||
#include "engine/plugins/nearest.hpp"
|
#include "engine/plugins/nearest.hpp"
|
||||||
#include "engine/plugins/table.hpp"
|
#include "engine/plugins/table.hpp"
|
||||||
@ -39,6 +40,8 @@ class EngineInterface
|
|||||||
virtual Status Trip(const api::TripParameters ¶meters, api::ResultT &result) const = 0;
|
virtual Status Trip(const api::TripParameters ¶meters, api::ResultT &result) const = 0;
|
||||||
virtual Status Match(const api::MatchParameters ¶meters, api::ResultT &result) const = 0;
|
virtual Status Match(const api::MatchParameters ¶meters, api::ResultT &result) const = 0;
|
||||||
virtual Status Tile(const api::TileParameters ¶meters, api::ResultT &result) const = 0;
|
virtual Status Tile(const api::TileParameters ¶meters, api::ResultT &result) const = 0;
|
||||||
|
|
||||||
|
virtual const EngineInfo &GetInfo() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Algorithm> class Engine final : public EngineInterface
|
template <typename Algorithm> class Engine final : public EngineInterface
|
||||||
@ -76,6 +79,9 @@ template <typename Algorithm> class Engine final : public EngineInterface
|
|||||||
<< routing_algorithms::name<Algorithm>();
|
<< routing_algorithms::name<Algorithm>();
|
||||||
facade_provider = std::make_unique<ImmutableProvider<Algorithm>>(config.storage_config);
|
facade_provider = std::make_unique<ImmutableProvider<Algorithm>>(config.storage_config);
|
||||||
}
|
}
|
||||||
|
info["algorithm"] = routing_algorithms::name<Algorithm>();
|
||||||
|
info["code_version"] = OSRM_VERSION;
|
||||||
|
info["data_version"] = GetAlgorithms(api::RouteParameters()).GetFacade().GetTimestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
Engine(Engine &&) noexcept = delete;
|
Engine(Engine &&) noexcept = delete;
|
||||||
@ -115,11 +121,14 @@ template <typename Algorithm> class Engine final : public EngineInterface
|
|||||||
return tile_plugin.HandleRequest(GetAlgorithms(params), params, result);
|
return tile_plugin.HandleRequest(GetAlgorithms(params), params, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const EngineInfo &GetInfo() const override final { return info; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename ParametersT> auto GetAlgorithms(const ParametersT ¶ms) const
|
template <typename ParametersT> auto GetAlgorithms(const ParametersT ¶ms) const
|
||||||
{
|
{
|
||||||
return RoutingAlgorithms<Algorithm>{heaps, facade_provider->Get(params)};
|
return RoutingAlgorithms<Algorithm>{heaps, facade_provider->Get(params)};
|
||||||
}
|
}
|
||||||
|
EngineInfo info;
|
||||||
std::unique_ptr<DataFacadeProvider<Algorithm>> facade_provider;
|
std::unique_ptr<DataFacadeProvider<Algorithm>> facade_provider;
|
||||||
mutable SearchEngineData<Algorithm> heaps;
|
mutable SearchEngineData<Algorithm> heaps;
|
||||||
|
|
||||||
@ -130,7 +139,7 @@ template <typename Algorithm> class Engine final : public EngineInterface
|
|||||||
const plugins::MatchPlugin match_plugin;
|
const plugins::MatchPlugin match_plugin;
|
||||||
const plugins::TilePlugin tile_plugin;
|
const plugins::TilePlugin tile_plugin;
|
||||||
};
|
};
|
||||||
}
|
} // namespace engine
|
||||||
}
|
} // namespace osrm
|
||||||
|
|
||||||
#endif // OSRM_IMPL_HPP
|
#endif // OSRM_IMPL_HPP
|
||||||
|
|||||||
48
include/engine/engine_info.hpp
Normal file
48
include/engine/engine_info.hpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2019, Project OSRM contributors
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ENGINE_INFO_HPP
|
||||||
|
#define ENGINE_INFO_HPP
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace osrm
|
||||||
|
{
|
||||||
|
namespace engine
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EngineInfo to return information about engine state into the monitoring
|
||||||
|
* \see OSRM
|
||||||
|
*/
|
||||||
|
|
||||||
|
using EngineInfo = std::unordered_map<std::string, std::string>;
|
||||||
|
|
||||||
|
} // namespace engine
|
||||||
|
} // namespace osrm
|
||||||
|
|
||||||
|
#endif
|
||||||
103
include/monitoring/monitoring.hpp
Normal file
103
include/monitoring/monitoring.hpp
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
#ifndef MONITORING_HPP
|
||||||
|
#define MONITORING_HPP
|
||||||
|
|
||||||
|
#include "monitoring/monitoring_request_handler.hpp"
|
||||||
|
#include "server/connection.hpp"
|
||||||
|
|
||||||
|
#include "util/log.hpp"
|
||||||
|
|
||||||
|
#include <boost/asio.hpp>
|
||||||
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
|
namespace osrm
|
||||||
|
{
|
||||||
|
namespace server
|
||||||
|
{
|
||||||
|
|
||||||
|
class Monitoring
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static std::shared_ptr<Monitoring>
|
||||||
|
CreateMonitoring(std::string &ip_address, const int ip_port, const unsigned working_threads)
|
||||||
|
{
|
||||||
|
return std::make_shared<Monitoring>(ip_address, ip_port, working_threads);
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit Monitoring(const std::string &address, const int port, const unsigned working_threads)
|
||||||
|
: acceptor(io_service), request_handler(working_threads),
|
||||||
|
new_connection(std::make_shared<Connection>(io_service, request_handler))
|
||||||
|
{
|
||||||
|
if (port == 0)
|
||||||
|
{
|
||||||
|
working = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
working = true;
|
||||||
|
const auto port_string = std::to_string(port);
|
||||||
|
|
||||||
|
boost::asio::ip::tcp::resolver resolver(io_service);
|
||||||
|
boost::asio::ip::tcp::resolver::query query(address, port_string);
|
||||||
|
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
|
||||||
|
|
||||||
|
acceptor.open(endpoint.protocol());
|
||||||
|
#ifdef SO_REUSEPORT
|
||||||
|
const int option = 1;
|
||||||
|
setsockopt(acceptor.native_handle(), SOL_SOCKET, SO_REUSEPORT, &option, sizeof(option));
|
||||||
|
#endif
|
||||||
|
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
|
||||||
|
acceptor.bind(endpoint);
|
||||||
|
acceptor.listen();
|
||||||
|
|
||||||
|
util::Log() << "Monitoring endpoint listening on: " << acceptor.local_endpoint();
|
||||||
|
|
||||||
|
acceptor.async_accept(
|
||||||
|
new_connection->socket(),
|
||||||
|
boost::bind(&Monitoring::HandleAccept, this, boost::asio::placeholders::error));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Run()
|
||||||
|
{
|
||||||
|
if (working)
|
||||||
|
{
|
||||||
|
io_service.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stop()
|
||||||
|
{
|
||||||
|
if (working)
|
||||||
|
{
|
||||||
|
io_service.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RegisterServiceHandler(std::shared_ptr<ServiceHandlerInterface> service_handler_)
|
||||||
|
{
|
||||||
|
request_handler.RegisterServiceHandler(service_handler_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void HandleAccept(const boost::system::error_code &e)
|
||||||
|
{
|
||||||
|
if (!e)
|
||||||
|
{
|
||||||
|
new_connection->start();
|
||||||
|
new_connection = std::make_shared<Connection>(io_service, request_handler);
|
||||||
|
acceptor.async_accept(
|
||||||
|
new_connection->socket(),
|
||||||
|
boost::bind(&Monitoring::HandleAccept, this, boost::asio::placeholders::error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::asio::io_service io_service;
|
||||||
|
boost::asio::ip::tcp::acceptor acceptor;
|
||||||
|
MonitoringRequestHandler request_handler;
|
||||||
|
std::shared_ptr<Connection> new_connection;
|
||||||
|
std::shared_ptr<std::thread> working_thread;
|
||||||
|
bool working;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace server
|
||||||
|
} // namespace osrm
|
||||||
|
|
||||||
|
#endif // MONITORING_HPP
|
||||||
54
include/monitoring/monitoring_request_handler.hpp
Normal file
54
include/monitoring/monitoring_request_handler.hpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#ifndef MONITORING_REQUEST_HANDLER_HPP
|
||||||
|
#define MONITORING_REQUEST_HANDLER_HPP
|
||||||
|
|
||||||
|
#include "server/request_handler.hpp"
|
||||||
|
|
||||||
|
#include "util/log.hpp"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace osrm
|
||||||
|
{
|
||||||
|
namespace server
|
||||||
|
{
|
||||||
|
|
||||||
|
class MonitoringRequestHandler : public RequestHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MonitoringRequestHandler(const unsigned _working_threads) : working_threads(_working_threads) {}
|
||||||
|
|
||||||
|
void HandleRequest(const http::request &, http::reply ¤t_reply)
|
||||||
|
{
|
||||||
|
std::stringstream out_stream;
|
||||||
|
out_stream << "osrm_routed_instance_info{";
|
||||||
|
auto engine_info = service_handler->GetEngineInfo();
|
||||||
|
for (auto record : engine_info)
|
||||||
|
{
|
||||||
|
out_stream << record.first << "=\"" << record.second << '"';
|
||||||
|
out_stream << ',';
|
||||||
|
}
|
||||||
|
out_stream << "working_threads=\"" << working_threads << '"';
|
||||||
|
out_stream << "} 1\n";
|
||||||
|
|
||||||
|
auto counters = service_handler->GetUsage();
|
||||||
|
for (auto counter : counters)
|
||||||
|
{
|
||||||
|
out_stream << "http_requests_count{plugin=\"" << counter.first << "\"} "
|
||||||
|
<< counter.second << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
out_stream << "workers_busy " << service_handler->GetLoad() << "\n";
|
||||||
|
|
||||||
|
auto result = out_stream.str();
|
||||||
|
current_reply.content.resize(result.size());
|
||||||
|
std::copy(result.cbegin(), result.cend(), current_reply.content.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned working_threads;
|
||||||
|
};
|
||||||
|
} // namespace server
|
||||||
|
} // namespace osrm
|
||||||
|
|
||||||
|
#endif // MONITORING_REQUEST_HANDLER_HPP
|
||||||
38
include/osrm/engine_info.hpp
Normal file
38
include/osrm/engine_info.hpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2017, Project OSRM contributors
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
Redistributions of source code must retain the above copyright notice, this list
|
||||||
|
of conditions and the following disclaimer.
|
||||||
|
Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OSRM_ENGINE_INFO_HPP
|
||||||
|
#define OSRM_ENGINE_INFO_HPP
|
||||||
|
|
||||||
|
#include "engine/engine_info.hpp"
|
||||||
|
|
||||||
|
namespace osrm
|
||||||
|
{
|
||||||
|
using engine::EngineInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "engine/api/base_result.hpp"
|
#include "engine/api/base_result.hpp"
|
||||||
#include "osrm/osrm_fwd.hpp"
|
#include "osrm/osrm_fwd.hpp"
|
||||||
#include "osrm/status.hpp"
|
#include "osrm/status.hpp"
|
||||||
|
#include "osrm/engine_info.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -131,6 +132,11 @@ class OSRM final
|
|||||||
*/
|
*/
|
||||||
Status Tile(const TileParameters ¶meters, osrm::engine::api::ResultT &result) const;
|
Status Tile(const TileParameters ¶meters, osrm::engine::api::ResultT &result) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tile: engine state information for monitoring purposes
|
||||||
|
*/
|
||||||
|
const EngineInfo & Info() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<engine::EngineInterface> engine_;
|
std::unique_ptr<engine::EngineInterface> engine_;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -24,12 +24,13 @@ class RequestHandler
|
|||||||
RequestHandler(const RequestHandler &) = delete;
|
RequestHandler(const RequestHandler &) = delete;
|
||||||
RequestHandler &operator=(const RequestHandler &) = delete;
|
RequestHandler &operator=(const RequestHandler &) = delete;
|
||||||
|
|
||||||
void RegisterServiceHandler(std::unique_ptr<ServiceHandlerInterface> service_handler);
|
void RegisterServiceHandler(std::shared_ptr<ServiceHandlerInterface> service_handler);
|
||||||
|
|
||||||
void HandleRequest(const http::request ¤t_request, http::reply ¤t_reply);
|
//TODO make interface and two siblings
|
||||||
|
virtual void HandleRequest(const http::request ¤t_request, http::reply ¤t_reply);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
std::unique_ptr<ServiceHandlerInterface> service_handler;
|
std::shared_ptr<ServiceHandlerInterface> service_handler;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -85,11 +85,13 @@ class Server
|
|||||||
|
|
||||||
void Stop() { io_service.stop(); }
|
void Stop() { io_service.stop(); }
|
||||||
|
|
||||||
void RegisterServiceHandler(std::unique_ptr<ServiceHandlerInterface> service_handler_)
|
void RegisterServiceHandler(std::shared_ptr<ServiceHandlerInterface> service_handler_)
|
||||||
{
|
{
|
||||||
request_handler.RegisterServiceHandler(std::move(service_handler_));
|
request_handler.RegisterServiceHandler(service_handler_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned GetWorkerThreadsCount() { return thread_pool_size; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void HandleAccept(const boost::system::error_code &e)
|
void HandleAccept(const boost::system::error_code &e)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <mapbox/variant.hpp>
|
#include <mapbox/variant.hpp>
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -20,16 +21,18 @@ namespace service
|
|||||||
class BaseService
|
class BaseService
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BaseService(OSRM &routing_machine) : routing_machine(routing_machine) {}
|
BaseService(OSRM &routing_machine) : routing_machine(routing_machine), usage(0) {}
|
||||||
virtual ~BaseService() = default;
|
virtual ~BaseService() = default;
|
||||||
|
|
||||||
virtual engine::Status
|
virtual engine::Status
|
||||||
RunQuery(std::size_t prefix_length, std::string &query, osrm::engine::api::ResultT &result) = 0;
|
RunQuery(std::size_t prefix_length, std::string &query, osrm::engine::api::ResultT &result) = 0;
|
||||||
|
|
||||||
virtual unsigned GetVersion() = 0;
|
virtual unsigned GetVersion() = 0;
|
||||||
|
uint32_t GetUsage() {return usage;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
OSRM &routing_machine;
|
OSRM &routing_machine;
|
||||||
|
std::atomic_uint usage;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,9 @@
|
|||||||
|
|
||||||
#include "engine/api/base_api.hpp"
|
#include "engine/api/base_api.hpp"
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "engine/engine_info.hpp"
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
@ -24,12 +26,17 @@ namespace api
|
|||||||
struct ParsedURL;
|
struct ParsedURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using HandlersCounter = std::unordered_map<std::string, std::uint32_t>;
|
||||||
|
|
||||||
class ServiceHandlerInterface
|
class ServiceHandlerInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~ServiceHandlerInterface() {}
|
virtual ~ServiceHandlerInterface() {}
|
||||||
virtual engine::Status RunQuery(api::ParsedURL parsed_url,
|
virtual engine::Status RunQuery(api::ParsedURL parsed_url,
|
||||||
osrm::engine::api::ResultT &result) = 0;
|
osrm::engine::api::ResultT &result) = 0;
|
||||||
|
virtual const engine::EngineInfo & GetEngineInfo() const = 0;
|
||||||
|
virtual const HandlersCounter GetUsage() const = 0;
|
||||||
|
virtual std::uint32_t GetLoad() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ServiceHandler final : public ServiceHandlerInterface
|
class ServiceHandler final : public ServiceHandlerInterface
|
||||||
@ -40,9 +47,15 @@ class ServiceHandler final : public ServiceHandlerInterface
|
|||||||
|
|
||||||
virtual engine::Status RunQuery(api::ParsedURL parsed_url, ResultT &result) override;
|
virtual engine::Status RunQuery(api::ParsedURL parsed_url, ResultT &result) override;
|
||||||
|
|
||||||
|
virtual const engine::EngineInfo & GetEngineInfo() const override;
|
||||||
|
virtual const HandlersCounter GetUsage() const override;
|
||||||
|
virtual std::uint32_t GetLoad() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unordered_map<std::string, std::unique_ptr<service::BaseService>> service_map;
|
std::unordered_map<std::string, std::unique_ptr<service::BaseService>> service_map;
|
||||||
OSRM routing_machine;
|
OSRM routing_machine;
|
||||||
|
std::atomic_uint errors;
|
||||||
|
std::atomic_uint load;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -92,4 +92,9 @@ engine::Status OSRM::Tile(const engine::api::TileParameters ¶ms,
|
|||||||
return engine_->Tile(params, result);
|
return engine_->Tile(params, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const engine::EngineInfo & OSRM::Info() const
|
||||||
|
{
|
||||||
|
return engine_->GetInfo();
|
||||||
|
}
|
||||||
|
|
||||||
} // ns osrm
|
} // ns osrm
|
||||||
|
|||||||
@ -33,9 +33,9 @@ namespace server
|
|||||||
{
|
{
|
||||||
|
|
||||||
void RequestHandler::RegisterServiceHandler(
|
void RequestHandler::RegisterServiceHandler(
|
||||||
std::unique_ptr<ServiceHandlerInterface> service_handler_)
|
std::shared_ptr<ServiceHandlerInterface> service_handler_)
|
||||||
{
|
{
|
||||||
service_handler = std::move(service_handler_);
|
service_handler = service_handler_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RequestHandler::HandleRequest(const http::request ¤t_request, http::reply ¤t_reply)
|
void RequestHandler::HandleRequest(const http::request ¤t_request, http::reply ¤t_reply)
|
||||||
|
|||||||
@ -45,6 +45,7 @@ engine::Status MatchService::RunQuery(std::size_t prefix_length,
|
|||||||
std::string &query,
|
std::string &query,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
usage++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
|
|
||||||
|
|||||||
@ -39,6 +39,7 @@ engine::Status NearestService::RunQuery(std::size_t prefix_length,
|
|||||||
std::string &query,
|
std::string &query,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
usage++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
|
|
||||||
|
|||||||
@ -43,6 +43,7 @@ engine::Status RouteService::RunQuery(std::size_t prefix_length,
|
|||||||
std::string &query,
|
std::string &query,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
usage++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
|
|
||||||
|
|||||||
@ -74,6 +74,7 @@ engine::Status TableService::RunQuery(std::size_t prefix_length,
|
|||||||
std::string &query,
|
std::string &query,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
usage++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,7 @@ engine::Status TileService::RunQuery(std::size_t prefix_length,
|
|||||||
std::string &query,
|
std::string &query,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
usage++;
|
||||||
auto query_iterator = query.begin();
|
auto query_iterator = query.begin();
|
||||||
auto parameters =
|
auto parameters =
|
||||||
api::parseParameters<engine::api::TileParameters>(query_iterator, query.end());
|
api::parseParameters<engine::api::TileParameters>(query_iterator, query.end());
|
||||||
|
|||||||
@ -45,6 +45,7 @@ engine::Status TripService::RunQuery(std::size_t prefix_length,
|
|||||||
std::string &query,
|
std::string &query,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
usage++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
|
|
||||||
|
|||||||
@ -12,11 +12,14 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#define BAD_SERVICE_NAME "invalid"
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
namespace server
|
namespace server
|
||||||
{
|
{
|
||||||
ServiceHandler::ServiceHandler(osrm::EngineConfig &config) : routing_machine(config)
|
ServiceHandler::ServiceHandler(osrm::EngineConfig &config)
|
||||||
|
: routing_machine(config), errors(0), load(0)
|
||||||
{
|
{
|
||||||
service_map["route"] = std::make_unique<service::RouteService>(routing_machine);
|
service_map["route"] = std::make_unique<service::RouteService>(routing_machine);
|
||||||
service_map["table"] = std::make_unique<service::TableService>(routing_machine);
|
service_map["table"] = std::make_unique<service::TableService>(routing_machine);
|
||||||
@ -29,27 +32,49 @@ ServiceHandler::ServiceHandler(osrm::EngineConfig &config) : routing_machine(con
|
|||||||
engine::Status ServiceHandler::RunQuery(api::ParsedURL parsed_url,
|
engine::Status ServiceHandler::RunQuery(api::ParsedURL parsed_url,
|
||||||
osrm::engine::api::ResultT &result)
|
osrm::engine::api::ResultT &result)
|
||||||
{
|
{
|
||||||
|
load++;
|
||||||
const auto &service_iter = service_map.find(parsed_url.service);
|
const auto &service_iter = service_map.find(parsed_url.service);
|
||||||
if (service_iter == service_map.end())
|
if (service_iter == service_map.end())
|
||||||
{
|
{
|
||||||
|
errors++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
json_result.values["code"] = "InvalidService";
|
json_result.values["code"] = "InvalidService";
|
||||||
json_result.values["message"] = "Service " + parsed_url.service + " not found!";
|
json_result.values["message"] = "Service " + parsed_url.service + " not found!";
|
||||||
|
load--;
|
||||||
return engine::Status::Error;
|
return engine::Status::Error;
|
||||||
}
|
}
|
||||||
auto &service = service_iter->second;
|
auto &service = service_iter->second;
|
||||||
|
|
||||||
if (service->GetVersion() != parsed_url.version)
|
if (service->GetVersion() != parsed_url.version)
|
||||||
{
|
{
|
||||||
|
errors++;
|
||||||
result = util::json::Object();
|
result = util::json::Object();
|
||||||
auto &json_result = result.get<util::json::Object>();
|
auto &json_result = result.get<util::json::Object>();
|
||||||
json_result.values["code"] = "InvalidVersion";
|
json_result.values["code"] = "InvalidVersion";
|
||||||
json_result.values["message"] = "Service " + parsed_url.service + " not found!";
|
json_result.values["message"] = "Service " + parsed_url.service + " not found!";
|
||||||
|
load--;
|
||||||
return engine::Status::Error;
|
return engine::Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return service->RunQuery(parsed_url.prefix_length, parsed_url.query, result);
|
const auto status = service->RunQuery(parsed_url.prefix_length, parsed_url.query, result);
|
||||||
}
|
load--;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const engine::EngineInfo &ServiceHandler::GetEngineInfo() const { return routing_machine.Info(); }
|
||||||
|
|
||||||
|
std::uint32_t ServiceHandler::GetLoad() const { return load; }
|
||||||
|
|
||||||
|
const HandlersCounter ServiceHandler::GetUsage() const
|
||||||
|
{
|
||||||
|
HandlersCounter handlers_counter;
|
||||||
|
for (const auto &service : service_map)
|
||||||
|
{
|
||||||
|
handlers_counter[service.first] = service.second->GetUsage();
|
||||||
|
}
|
||||||
|
handlers_counter[BAD_SERVICE_NAME] = errors;
|
||||||
|
return handlers_counter;
|
||||||
}
|
}
|
||||||
|
} // namespace server
|
||||||
|
} // namespace osrm
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
#include "monitoring/monitoring.hpp"
|
||||||
#include "server/server.hpp"
|
#include "server/server.hpp"
|
||||||
#include "util/exception_utils.hpp"
|
#include "util/exception_utils.hpp"
|
||||||
#include "util/log.hpp"
|
#include "util/log.hpp"
|
||||||
@ -29,6 +30,7 @@
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
boost::function0<void> console_ctrl_function;
|
boost::function0<void> console_ctrl_function;
|
||||||
|
boost::function0<void> console_ctrl_function_monitoring;
|
||||||
|
|
||||||
BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
|
BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
|
||||||
{
|
{
|
||||||
@ -39,6 +41,7 @@ BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
|
|||||||
case CTRL_CLOSE_EVENT:
|
case CTRL_CLOSE_EVENT:
|
||||||
case CTRL_SHUTDOWN_EVENT:
|
case CTRL_SHUTDOWN_EVENT:
|
||||||
console_ctrl_function();
|
console_ctrl_function();
|
||||||
|
console_ctrl_function_monitoring();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -79,6 +82,7 @@ inline unsigned generateServerProgramOptions(const int argc,
|
|||||||
boost::filesystem::path &base_path,
|
boost::filesystem::path &base_path,
|
||||||
std::string &ip_address,
|
std::string &ip_address,
|
||||||
int &ip_port,
|
int &ip_port,
|
||||||
|
int &ip_port_metrics,
|
||||||
bool &trial,
|
bool &trial,
|
||||||
EngineConfig &config,
|
EngineConfig &config,
|
||||||
int &requested_thread_num)
|
int &requested_thread_num)
|
||||||
@ -111,6 +115,11 @@ inline unsigned generateServerProgramOptions(const int argc,
|
|||||||
("port,p",
|
("port,p",
|
||||||
value<int>(&ip_port)->default_value(5000),
|
value<int>(&ip_port)->default_value(5000),
|
||||||
"TCP/IP port") //
|
"TCP/IP port") //
|
||||||
|
(
|
||||||
|
"metrics_port,P",
|
||||||
|
value<int>(&ip_port_metrics)->default_value(0),
|
||||||
|
"TCP/IP port for prometheus metrics exporter. Leave 0 if do not start server for "
|
||||||
|
"metrics") //
|
||||||
("threads,t",
|
("threads,t",
|
||||||
value<int>(&requested_thread_num)->default_value(hardware_threads),
|
value<int>(&requested_thread_num)->default_value(hardware_threads),
|
||||||
"Number of threads to use") //
|
"Number of threads to use") //
|
||||||
@ -227,13 +236,21 @@ int main(int argc, const char *argv[]) try
|
|||||||
bool trial_run = false;
|
bool trial_run = false;
|
||||||
std::string ip_address;
|
std::string ip_address;
|
||||||
int ip_port;
|
int ip_port;
|
||||||
|
int ip_port_metrics;
|
||||||
|
|
||||||
EngineConfig config;
|
EngineConfig config;
|
||||||
boost::filesystem::path base_path;
|
boost::filesystem::path base_path;
|
||||||
|
|
||||||
int requested_thread_num = 1;
|
int requested_thread_num = 1;
|
||||||
const unsigned init_result = generateServerProgramOptions(
|
const unsigned init_result = generateServerProgramOptions(argc,
|
||||||
argc, argv, base_path, ip_address, ip_port, trial_run, config, requested_thread_num);
|
argv,
|
||||||
|
base_path,
|
||||||
|
ip_address,
|
||||||
|
ip_port,
|
||||||
|
ip_port_metrics,
|
||||||
|
trial_run,
|
||||||
|
config,
|
||||||
|
requested_thread_num);
|
||||||
if (init_result == INIT_OK_DO_NOT_START_ENGINE)
|
if (init_result == INIT_OK_DO_NOT_START_ENGINE)
|
||||||
{
|
{
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
@ -284,10 +301,13 @@ int main(int argc, const char *argv[]) try
|
|||||||
pthread_sigmask(SIG_BLOCK, &wait_mask, nullptr); // only block necessary signals
|
pthread_sigmask(SIG_BLOCK, &wait_mask, nullptr); // only block necessary signals
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto service_handler = std::make_unique<server::ServiceHandler>(config);
|
auto service_handler = std::make_shared<server::ServiceHandler>(config);
|
||||||
auto routing_server = server::Server::CreateServer(ip_address, ip_port, requested_thread_num);
|
auto routing_server = server::Server::CreateServer(ip_address, ip_port, requested_thread_num);
|
||||||
|
auto monitoring_server = server::Monitoring::CreateMonitoring(
|
||||||
|
ip_address, ip_port_metrics, routing_server->GetWorkerThreadsCount());
|
||||||
|
|
||||||
routing_server->RegisterServiceHandler(std::move(service_handler));
|
routing_server->RegisterServiceHandler(service_handler);
|
||||||
|
monitoring_server->RegisterServiceHandler(service_handler);
|
||||||
|
|
||||||
if (trial_run)
|
if (trial_run)
|
||||||
{
|
{
|
||||||
@ -299,8 +319,13 @@ int main(int argc, const char *argv[]) try
|
|||||||
routing_server->Run();
|
routing_server->Run();
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
std::packaged_task<int()> monitoring_task([&] {
|
||||||
|
monitoring_server->Run();
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
auto future = server_task.get_future();
|
auto future = server_task.get_future();
|
||||||
std::thread server_thread(std::move(server_task));
|
std::thread server_thread(std::move(server_task));
|
||||||
|
std::thread monitoring_thread(std::move(monitoring_task));
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
util::Log() << "running and waiting for requests";
|
util::Log() << "running and waiting for requests";
|
||||||
@ -313,12 +338,17 @@ int main(int argc, const char *argv[]) try
|
|||||||
#else
|
#else
|
||||||
// Set console control handler to allow server to be stopped.
|
// Set console control handler to allow server to be stopped.
|
||||||
console_ctrl_function = std::bind(&server::Server::Stop, routing_server);
|
console_ctrl_function = std::bind(&server::Server::Stop, routing_server);
|
||||||
|
console_ctrl_function_monitoring =
|
||||||
|
std::bind(&monitoring::Monitoring::Stop, monitoring_server);
|
||||||
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
|
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
|
||||||
|
SetConsoleCtrlHandler(console_ctrl_handler_monitoring, TRUE);
|
||||||
util::Log() << "running and waiting for requests";
|
util::Log() << "running and waiting for requests";
|
||||||
|
monitoring_server->Run();
|
||||||
routing_server->Run();
|
routing_server->Run();
|
||||||
#endif
|
#endif
|
||||||
util::Log() << "initiating shutdown";
|
util::Log() << "initiating shutdown";
|
||||||
routing_server->Stop();
|
routing_server->Stop();
|
||||||
|
monitoring_server->Stop();
|
||||||
util::Log() << "stopping threads";
|
util::Log() << "stopping threads";
|
||||||
|
|
||||||
auto status = future.wait_for(std::chrono::seconds(2));
|
auto status = future.wait_for(std::chrono::seconds(2));
|
||||||
@ -326,6 +356,7 @@ int main(int argc, const char *argv[]) try
|
|||||||
if (status == std::future_status::ready)
|
if (status == std::future_status::ready)
|
||||||
{
|
{
|
||||||
server_thread.join();
|
server_thread.join();
|
||||||
|
monitoring_thread.join();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -336,6 +367,7 @@ int main(int argc, const char *argv[]) try
|
|||||||
|
|
||||||
util::Log() << "freeing objects";
|
util::Log() << "freeing objects";
|
||||||
routing_server.reset();
|
routing_server.reset();
|
||||||
|
monitoring_server.reset();
|
||||||
util::Log() << "shutdown completed";
|
util::Log() << "shutdown completed";
|
||||||
}
|
}
|
||||||
catch (const osrm::RuntimeError &e)
|
catch (const osrm::RuntimeError &e)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user