源码编译
./mvnw clean package -DskipTests
以上命令可以完成源码编译,中间过程如遇npm,maven等问题百度很快可以解决
IDEA 运行
OAPServerStartUp.java
main()
函数运行启动 OAPServer
skywalking-ui 目录运行 npm run serve
启动前台服务,访问 http://localhost:8081
安装 agent 等可参考官网或者其他博文,不再赘述
问题场景
源码运行后发现 trace 和 metics 数据无法上报,OAPServer 出现错误日志,代码位置: ElasticSearchClient.java
类中 log.warn("Bulk [{}] executed with failures", executionId);
从错误日志上无法知道原因,因为没有打印错误详细信息,调整代码:log.warn("Bulk [{}] executed with failures:[{}]", executionId, response.buildFailureMessage());
调整后详细信息出现,大意是字符串无法格式化成整型,查询日志中相关表 serviceId
为整型,但是提交的数据确实字符串,有些诧异,虽然是SNAPSHOT版,但也不应该如此,跟踪代码发现原来 serviceId
的生成规则变了,由原来的 inventory
表的主键改为了根据服务名称和节点类型生成,生成规则如下:
/**
* @return encoded service id
*/
public static String buildId(String name, NodeType type) {
return buildId(name, type.equals(NodeType.Normal));
}
public static String buildId(String name, boolean isNormal) {
return encode(name) + Const.SERVICE_ID_CONNECTOR + BooleanUtils.booleanToValue(isNormal);
}
/**
* @param text normal literal string
* @return Base74 encoded UTF-8 string
*/
private static String encode(String text) {
return new String(Base64.getEncoder().encode(text.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
}
进一步推测,可能与 ES 中索引映射关系有关,毕竟之前这个 ES 跑过 Skywalking6 ,删除索引后重新运行创建索引依然是还是 Integer 类型。联系前面对 Skywalking 的了解,Skywalking 使用 ES 模版创建索引,规则是模版如果存在不再新建模版,到这里真相水落石出,Skywalking 8 数据结构发生了变化,我依然使用原来的 ES,删除模版后重新启动,一切安好,并且看到了新版的一些功能提升。
PS :另外还有一个简单的办法可以避免这个问题,并且让多个版本跑在一个 ES 中,OAPServer application.yml
配置 namespace,位置如下:
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
nameSpace: ${SW_NAMESPACE:"sw8"}
强烈推荐使用,方便 ES 索引和模版管理,删除索引时你就知道有个 namespace 有多酸爽。
网友评论