Valhalla /status 服务 API 详解:健康检查端点与 Tileset 状态查询实战
后端【免费下载链接】valhallaOpen Source Routing Engine for OpenStreetMap项目地址https://gitcode.com/gh_mirrors/va/valhalla点击查看免费下载导读/status是 Valhalla 路由引擎暴露的一个轻量级状态服务端点默认返回 HTTP 200 以及version、tileset_last_modified两个字段可直接充当 HTTP API 的健康检查health check端点传入verbose: true后它会额外返回当前加载 tileset 的完整状态信息是否含行政边界、时区、实时交通、范围 bbox 等。读完本文你将掌握/status的请求方式、全部响应字段含义、service_limits.status.allow_verbose配置开关的作用以及该端点背后的源码实现与测试验证方式。一、端点概览默认行为与健康检查用途Valhalla 的 Loki 服务在启动时会挂载一组 HTTP 端点/route、/locate、/status等其中/status的设计初衷就是让运维与监控系统能够低成本地判断服务实例是否存活、tileset 是否就绪。默认不传任何参数情况下向/status发起GET请求会返回 HTTP 状态码200返回version与tileset_last_modified两个基础字段tileset_last_modified以UNIX 时间戳秒形式表示 tile_extract 或 tile_dir 的最后修改时间。这两个字段始终返回、无需额外计算因此/status非常适合被接入 Prometheus 探针、K8s liveness/readiness probe 或负载均衡器的健康检查脚本。官方 API 文档原文即明确说明其can also be used as a health endpoint for the HTTP API关联文档。从源码实现看这一始终返回的逻辑位于 src/loki/status_action.cc// info thats always returned auto* status request.mutable_status(); status-set_version(VALHALLA_PRINT_VERSION); status-set_tileset_last_modified(get_tileset_last_modified(reader)); for (size_t i 0; i actions.size(); i) if (actions[i]) *status-mutable_available_actions()-Add() Options_Action_Enum_Name(static_castOptions::Action(i));其中get_tileset_last_modified通过valhalla::filesystem_utils::last_write_time_t(path)读取GraphReader的 tileset 所在路径tile_dir 或 tile_extract 文件的最后写入时间若读取失败则返回 0。此外源码还在处理请求前检查了服务是否处于排空draining或关闭shutting down状态若是则抛出valhalla_exception_t{102}让负载均衡器收到明确的服务下线信号status_action.cc。二、请求方式与 verbose 参数/status支持 GET 请求参数以 JSON 形式通过jsonquery string 传递# 1. 基础健康检查返回 version tileset_last_modified curl http://localhost:8002/status # 2. 获取完整的 tileset 状态信息 curl http://localhost:8002/status?json{\verbose\: true}关键点在于verbose: true作为请求参数传入后服务端才会返回有关已加载 tileset 的附加信息官方文档特别提醒收集这些附加信息在计算上可能很昂贵computationally expensive因此verbose开关可以由配置项service_limits.status.allow_verbose统一管制其默认值为false关联文档。配置 JSON 中对应的写法为{ service_limits: { status: { allow_verbose: false } } }在 src/loki/worker.cc 中该配置被读取并保存为成员变量allow_verbose config.getbool(service_limits.status.allow_verbose, false);随后在 status_action.cc 中作为 verbose 输出的双重门禁// only return more info if explicitly asked for (can be very expensive) if (!request.options().verbose() || !allow_verbose) return;也就是说只有同时满足请求携带verbose: true与配置允许 verbose两个条件才会进入附加信息组装分支任一不满足响应都只包含基础字段。配置生成脚本 scripts/valhalla_build_config 中对该键的说明也印证了这一设计意图Allow verbose output for the /status endpoint, which can be computationally expensive。三、响应字段详解当verbose: true被允许并传入时/status会返回下表所列的全部字段Response keyTypeDescriptionversionstring当前 Valhalla 版本号例如3.1.4。tileset_last_modifiedintegertile_extract 或 tile_dir 的最后修改时间UNIX 时间戳例如1634903519。has_tilesbool当前是否加载了有效的 tileset。has_adminsbool当前 tileset 是否使用 admin 数据库构建即是否包含行政边界数据。has_timezonesbool当前 tileset 是否使用时区数据库构建。has_live_trafficbool实时交通 tiles 当前是否可用。bboxobjecttileset 范围的 GeoJSON。osm_changeset可选integertileset 的dataset_id字段用于数据变更识别。warnings可选array包含警告对象如已废弃的请求参数、被 clamp 的值等的数组。字段语义与源码对应关系各布尔字段的判定逻辑可以在 status_action.cc 中逐一对上// get _some_ tile const static baldr::graph_tile_ptr tile get_graphtile(reader); if (connectivity_map) { status-set_bbox(connectivity_map-to_geojson(2)); const bool has_transit_tiles connectivity_map-level_color_exists(TileHierarchy::GetTransitLevel().level); status-set_has_transit_tiles(has_transit_tiles); } else { const static bool has_transit_tiles !reader-GetTileSet(3).empty(); status-set_has_transit_tiles(has_transit_tiles); } status-set_has_tiles(static_castbool(tile)); status-set_has_admins(tile tile-header()-admincount() 0); status-set_has_timezones(tile tile-node(0)-timezone() 0); status-set_has_live_traffic(reader-HasLiveTraffic()); status-set_osm_changeset(tile ? tile-header()-dataset_id() : 0);对应关系如下has_tilesget_graphtile会遍历GraphReader的 tileset找到第一个层级低于 transit level 且nodecount 0的瓦片能找到有效瓦片即为true。has_admins取到的瓦片头部admincount() 0表示瓦片内存在行政边界记录。has_timezones瓦片第一个节点node(0)-timezone() 0表示瓦片带有时区信息。has_live_traffic直接询问GraphReader::HasLiveTraffic()反映实时交通 tile 是否已就绪。bbox优先由connectivity_map-to_geojson(2)生成连通分量的 GeoJSON 范围该字段在响应中以嵌套 JSON 对象的形式输出。osm_changeset取自瓦片头部的dataset_id()字段即文档中提到的变更识别依据详细机制可参阅 Change identification 概念文档。需要说明的是虽然 proto/descriptors/status.proto 中还定义了has_transit_tiles字段是否包含 transit tiles但官方 API 参考文档的响应表中并未列出该键因此它属于实现层信息实际 HTTP 输出时也仅在 verbose 分支中随 bbox 一同写入见 src/tyr/serializers.cc。关于warnings字段它由 Loki 层通用警告机制注入用于报告已废弃请求参数、数值被 clamp 等情况在基础请求中通常不出现。JSON 序列化细节HTTP 输出的 JSON 组装位于 src/tyr/serializers.cc 的serializeStatus函数中两个值得注意的细节osm_changeset为 0 时不出现在输出中——源码注释明确写道 a 0 changeset indicates theres none, so dont write in the output这正是该字段被标记为可选的原因if (request.status().has_osm_changeset_case() request.status().osm_changeset()) status_doc.AddMember(osm_changeset, ...);bbox以二次解析的 JSON 对象写入Loki 层将其序列化为字符串tyr 层再用 RapidJSON 解析后挂到status_doc的/bbox路径下保证最终输出是结构化对象而非字符串。四、verbose 响应示例综合以上实现一次被允许的 verbose 请求响应大致如下字段顺序与具体值依 tileset 而定{ version: 3.1.4, tileset_last_modified: 1634903519, available_actions: [locate, route, height, optimized_route, isochrone, trace_route, trace_attributes, transit_available, expansion, centroid, status, tile], has_tiles: true, has_admins: true, has_timezones: true, has_live_traffic: false, has_transit_tiles: false, bbox: { type: Polygon, coordinates: [...] } }注意available_actions虽然未出现在官方文档的字段表中但它是 status.proto 中定义的固定字段字段号 8且由 serializers.cc 无条件写入输出用于告知客户端当前 Loki 实例启用了哪些 action如locate、route、isochrone等。五、调用链与测试验证底层调用链一次/status请求的完整链路为HTTP 路由层prime_server将请求分发到 Loki 的statusactionLoki 层loki_worker_t::status()填充Api::mutable_status()status_action.cc——检查服务排空状态、写入基础字段、按需写入 verbose 字段tyr 层serializeStatus()将 protobuf 状态对象序列化为 JSON 或 PBF当请求formatpbf时走serializePbf分支serializers.cc。该端点还被纳入 Loki 的 action 白名单体系service_limits下的status配置段与max_locations等通用限制解耦loki/worker.cc 在遍历service_limits时明确跳过了status与allow_hard_exclusions这类非位置型服务限制避免对其误用max_locations校验。测试用例仓库测试对该端点有直接覆盖可作为你验证自身部署行为是否正确的参照test/loki_service.cc 构造了GET /status与GET /status?json{verbose: true}两组 HTTP 请求用于验证路由层对该端点的分发与参数解析test/actor.cc 通过 Actor API 分别以空参数和{verbose: true}调用status()验证两种模式下的序列化输出test/bindings/valhalla.json 与 test/test.cc 中的测试配置展示了service_limits.status.allow_verbose在开启/关闭两种配置下的测试环境设定。如果你需要在本机复现可以参考 valhalla_build_config 生成的默认配置模板确认service_limits.status.allow_verbose的当前取值后再启动valhalla_service进行实测。六、典型使用场景小结健康检查 / 存活探测监控系统只需解析version与tileset_last_modified两个低成本字段确认实例存活且 tileset 未过期通过比较时间戳与预期更新时间。部署变更验证升级 tileset 后调用 verbose 模式检查has_tiles、has_admins、has_timezones、has_live_traffic是否符合预期快速定位数据构建时遗漏 admin/时区/交通数据的问题。范围与版本审计通过bboxGeoJSON核对服务所辖地理范围通过version与osm_changeset确认二进制与数据集的版本匹配情况。服务下线协调利用源码中排空/关闭时返回异常 102的行为配合负载均衡器实现优雅摘流。参考文件索引官方 API 文档docs/docs/api/status.mdLoki 层实现src/loki/status_action.cc配置读取src/loki/worker.cctyr 层 JSON 序列化src/tyr/serializers.cc响应消息定义proto/descriptors/status.proto配置模板生成脚本scripts/valhalla_build_config相关测试test/loki_service.cc、test/actor.cc变更识别概念docs/docs/concepts/change-identification.md赞分享后端【免费下载链接】valhallaOpen Source Routing Engine for OpenStreetMap项目地址https://gitcode.com/gh_mirrors/va/valhalla点击查看免费下载相关推荐Crater服务健康检查端点自定义健康状态实现Crater服务健康检查端点自定义健康状态实现 健康检查端点概述 在现代应用开发中服务健康检查Health Check是保障系统稳定性的关键组件。它通过后端前端企业应用免费离线音频转录终极指南用Buzz在本地电脑上实现专业级语音转文字免费离线音频转录终极指南用Buzz在本地电脑上实现专业级语音转文字 还在为音频转录发愁吗每次开会、听课、采访都要手动记录既费时又容易出错今天我要向你介绍人工智能语音音频本地部署桌面应用SkyWalking OAP 健康检查使用 /healthcheck HTTP 端点检测服务健康状态SkyWalking OAP 健康检查使用 /healthcheck HTTP 端点检测服务健康状态 SkyWalking OAPObservability可观测性后端微服务云原生上一篇如何完整安全地卸载 Ralph for Claude Code5 步清理全局命令与 ~/.ralph 残留下一篇3步搞定AI唇形同步sd-wav2lip-uhq完整解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

太空光伏电池联合环境试验:剖面设计、设备耦合与数据判读实战

太空光伏电池联合环境试验:剖面设计、设备耦合与数据判读实战

太空光伏电池的联合环境试验,听起来是个特别“重”的话题。但做航天载荷和电源系统的朋友心里都清楚,这恰恰是型号任务里最容易出问题、也最容易被低估的一环。月球车要扛月夜,深空探测器要扛低温,近地轨道卫星要扛几百上千次冷热…

2026/10/10 8:51:25 阅读更多 →
Policy Disruption in Reinforcement Learning:Adversarial Attack with Large Language Models and Cri...

Policy Disruption in Reinforcement Learning:Adversarial Attack with Large Language Models and Cri...

文章主要内容总结 本文聚焦强化学习(RL)系统的对抗性攻击问题,针对现有攻击方法需修改环境或策略、实用性有限的缺陷,提出了一种名为ARCS(Adversarial Rewards and Critical State Identification)的自适应对抗框架。该框架无需改变环境,通过现有代理引导目标策略输出次…

2026/10/10 8:50:24 阅读更多 →
gsd-core Plan-Phase 停滞检测(Stall Detection)实现解析:从无限等待到有界自动恢复

gsd-core Plan-Phase 停滞检测(Stall Detection)实现解析:从无限等待到有界自动恢复

【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 点击查看 免费下载 导读 本文深入解析 gsd-core(Git. Ship. Done - Core)在 plan-phase(规划阶段)中引入的…

2026/10/11 10:31:29 阅读更多 →

最新新闻

小学组C++算法赛初赛备考指南:从真题拆解到避坑技巧

小学组C++算法赛初赛备考指南:从真题拆解到避坑技巧

简介:这份资源是2024年信息素养大赛C算法创意实践挑战赛小学组初赛的真题解析文档,面向小学阶段对编程有兴趣、已具备一定C基础的学习者,也适合指导教师作为教学参考。内容覆盖单选题与判断题两种题型,涉及变量定义、运算符、布尔…

2026/10/11 10:56:27 阅读更多 →
为什么 Local Studio 要维护双引擎栈?engines 与 compute 架构及 ComputeBridge 桥接实现解析

为什么 Local Studio 要维护双引擎栈?engines 与 compute 架构及 ComputeBridge 桥接实现解析

【免费下载链接】local-studio Control panel for VLLM, Sglang, llama.cpp, exllamav3 项目地址: https://gitcode.com/gh_mirrors/vl/local-studio 点击查看 免费下载 Local Studio 是一款本地优先的 LLM 推理控制台,统一管理 vLLM、SGLang、llama.cp…

2026/10/11 10:56:27 阅读更多 →
每日算法题2

每日算法题2

链接:LCR 170. 交易逆序对的总数 - 力扣(LeetCode) 在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record&#xff0c…

2026/10/11 10:56:27 阅读更多 →
如何用电脑键盘操控手机终端:OpenClaw on Android搭配Termux的SSH远程配置完全指南

如何用电脑键盘操控手机终端:OpenClaw on Android搭配Termux的SSH远程配置完全指南

移动开发AI 应用CLI开发工具 【免费下载链接】openclaw-android Run OpenClaw on Android with a single command — no proot, no Linux 项目地址: https://gitcode.com/gh_mirrors/op/openclaw-android 点击查看 免费下载 OpenClaw on Android 让你在手机上运行 …

2026/10/11 10:56:27 阅读更多 →
Mesh 还是 Focus?Cell Architecture Studio 双视图模式与截面透视实战指南

Mesh 还是 Focus?Cell Architecture Studio 双视图模式与截面透视实战指南

【免费下载链接】cell-architecture-studio Interactive 3D cell architecture gallery built with React and Three.js 项目地址: https://gitcode.com/gh_mirrors/ce/cell-architecture-studio 点击查看 免费下载 Cell Architecture Studio 是一款基于 React 和 …

2026/10/11 10:56:27 阅读更多 →
【AI 和未来】工作(1)

【AI 和未来】工作(1)

原文链接:https://www.ibm.com/cn-zh/think/insights/ai-and-the-future-of-work 概述 人工智能融入职场是重大技术变革,开启人机协作时代。叠加全球技能短缺、后疫情远程办公、企业数据爆炸等背景,AI成为企业解决业务难题、打造个性化员工体…

2026/10/11 10:55:27 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →