Skywalking 8 源码编译 IDEA 运行问题

源码编译

./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 有多酸爽。

推荐阅读更多精彩内容