serviceErrors
Exception while fetching data (/services) : java.lang.RuntimeException: {“error”:{“root_cause”:[{“type”:“index_not_found_exception”,“reason”:“no such index [sw_service_traffic]”,“resource.type”:“index_or_alias”,“resource.id”:“sw_service_traffic”,“index_uuid”:“na”,“index”:“sw_service_traffic”}],“type”:“index_not_found_exception”,“reason”:“no such index [sw_service_traffic]”,“resource.type”:“index_or_alias”,“resource.id”:“sw_service_traffic”,“index_uuid”:“na”,“index”:“sw_service_traffic”},“status”:404}
遇到的这个异常表明在尝试访问 Elasticsearch 中一个不存在的索引 sw_service_traffic。这个问题通常发生在以下几个场景:
索引尚未创建:可能是因为配置错误或部署过程中的遗漏,导致索引没有被正确创建。
索引已被删除:可能是意外操作或维护过程中被删除了。
配置问题:应用程序和 Elasticsearch 实例之间的配置不匹配。
解决方案
1. 验证索引是否存在
首先,确认该索引是否确实不存在。你可以通过 Elasticsearch 的 API 来检查索引是否存在:
curl -X GET "http://localhost:9200/sw_service_traffic"
如果返回类似 {"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index [sw_service_traffic]"}],"type":"index_not_found_exception","reason":"no such index [sw_service_traffic]"}}, 那么索引确实不存在。
2. 创建索引
如果索引不存在,你需要创建它。这可以通过编写一个脚本或者使用 REST API 来完成。例如,可以使用以下命令来创建索引:
curl -X PUT "http://localhost:9200/sw_service_traffic" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}'
3. 在 SkyWalking 中如果 Elasticsearch 索引不存在
Apache SkyWalking 是一个应用性能监控 (APM) 工具,它可以自动检测、追踪和报告应用程序的性能数据。SkyWalking 使用 Elasticsearch 作为其默认的数据存储后端之一,用于存储追踪数据、度量指标等。
对于您提到的情况,在 SkyWalking 中如果 Elasticsearch 索引不存在,SkyWalking 通常不会自动创建这些索引。但是,您可以通过配置来实现自动创建索引的功能。
4.自动创建索引
使用 SkyWalking 的动态配置:
SkyWalking 支持通过配置文件自动创建 Elasticsearch 索引。您需要在 application.yml 或者 oap-server.yml 文件中设置相应的配置选项。例如:
深色版本
storage:
elasticsearch:
indices:
auto-create: true
这个配置告诉 SkyWalking 在启动时检查所需的 Elasticsearch 索引,并在索引不存在时自动创建它们。
使用 Elasticsearch 的索引模板:
另一种方法是为 SkyWalking 的索引定义索引模板。Elasticsearch 索引模板允许您预先定义索引的设置和映射,当新的索引被创建时,这些设置会被自动应用。您可以在 Elasticsearch 中预先配置好索引模板。 例如,您可以使用以下命令创建一个索引模板:
curl -X PUT "http://localhost:9200/_template/skywalking" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["sw_*"],
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"dynamic": "strict",
"properties": {
"timestamp": { "type": "date" },
"serviceId": { "type": "long" },
"serviceInstanceName": { "type": "keyword" }
}
}
}
'
这将为所有以 sw_ 开头的新索引应用相同的设置和映射。
-X PUT: 使用 HTTP PUT 方法发送请求。
"http://localhost:9200/_template/skywalking": 发送请求到 Elasticsearch 的 _template 路径,路径中的 skywalking 是模板的名字。
-H 'Content-Type: application/json': 设置请求头中的 Content-Type 为 application/json,表明发送的数据格式为 JSON。
-d: 指定请求体的内容。
JSON 内容解释
index_patterns: 定义此模板适用于哪些索引。这里的 "sw_*" 表示所有以 sw_ 开头的索引都会使用这个模板。
settings: 定义索引的设置。
"number_of_shards": 索引的分片数量。这里设置为 5,意味着索引将被分成 5 个主分片。
"number_of_replicas": 主分片的副本数量。这里设置为 1,意味着每个主分片都将有一个副本。
mappings: 定义索引的映射规则,即文档字段的类型和属性。
"dynamic": 控制是否允许自动创建未在映射中定义的字段。这里设置为 "strict" 表示不允许自动创建新字段。
"properties": 明确定义字段及其类型。
"timestamp": 字段类型为 date,表示这是一个日期类型字段。
"serviceId": 字段类型为 long,表示这是一个长整型数字字段。
"serviceInstanceName": 字段类型为 keyword,表示这是一个关键词类型字段,通常用于不需要分析的字符串,比如索引服务实例的名称。
总结
这段命令将会向 Elasticsearch 发送一个请求,创建一个名为 skywalking 的索引模板。这个模板将应用于所有以 sw_ 开头的索引,并且会为这些索引定义指定的设置和映射规则。这意味着每当一个新的索引被创建并且符合这个模式时,Elasticsearch 将自动应用上述定义的设置和映射。
这样设置可以简化索引管理和确保所有相关的索引都有一致的结构。
5.手动创建索引:
如果您希望手动控制索引的创建,您可以在 SkyWalking 启动前使用 Elasticsearch 的 REST API 或者管理工具来创建所需的索引。例如,如果您知道 SkyWalking 会使用特定的索引名(如 sw_service_traffic),那么您可以提前创建该索引。
注意事项
当使用自动创建索引的功能时,请确保您理解 Elasticsearch 索引的生命周期管理策略,以及这些索引将如何影响您的存储空间和性能。
确保在生产环境中对自动创建索引的行为进行适当的限制,以避免不必要的索引创建。
如果您使用的是较旧版本的 SkyWalking 或者遇到了兼容性问题,您可能需要查看官方文档以获得更详细的指导。
请检查您的 SkyWalking 版本,并参考官方文档来确定最适合您的配置方式。如果您需要进一步的帮助,包括具体的配置示例或其他细节,请告诉我您的 SkyWalking 版本和其他相关信息。
6.配置了之后如何查看索引创建情况
1. 查看索引列表
首先,您可以列出所有现有的索引,看看是否已经创建了 sw_* 索引。使用以下命令:
深色版本
curl -X GET "http://localhost:9200/_cat/indices?v=true&pretty"
这将返回所有索引的列表,包括它们的状态、UUID、优先级、主分片数、副本分片数、文档数、存储大小等信息。您可以在输出中查找以 sw_ 开头的索引。
2. 检查特定索引
如果您想检查某个具体索引的状态和设置,可以使用以下命令:
深色版本
curl -X GET "http://localhost:9200/sw_service_traffic?pretty"
这将返回索引的详细信息,包括设置和映射。
3. 检查索引的设置
如果您想查看特定索引的设置,可以使用以下命令:
深色版本
curl -X GET "http://localhost:9200/sw_service_traffic/_settings?pretty"
这将显示索引的设置,包括主分片数 (number_of_shards) 和副本分片数 (number_of_replicas)。
4. 检查索引的映射
如果您想查看特定索引的映射,可以使用以下命令:
深色版本
curl -X GET "http://localhost:9200/sw_service_traffic/_mapping?pretty"
这将显示索引的映射信息,包括字段类型和其他映射配置。
5. 检查索引模板
如果您想查看索引模板是否已成功创建,可以使用以下命令:
深色版本
curl -X GET "http://localhost:9200/_templates/skywalking?pretty"
这将返回索引模板的信息,包括其设置和映射配置。
6. 监控集群健康状态
您还可以监控集群的整体健康状态,以确保索引的创建没有引起任何问题。使用以下命令:
深色版本
curl -X GET "http://localhost:9200/_cluster/health?pretty"
这将返回集群的健康状态,包括活跃的主分片数和副本分片数。
7. 检查日志
最后,检查 Elasticsearch 的日志文件也是一个好的习惯,特别是如果遇到任何问题。日志文件通常位于 $ES_HOME/logs 目录下。
示例输出
假设您使用了上面提供的命令创建了索引模板,并且 Elasticsearch 成功创建了一个以 sw_ 开头的索引,例如 sw_service_traffic,那么您可能会看到类似于下面的输出:
深色版本
$ curl -X GET "http://localhost:9200/sw_service_traffic?pretty"
{
"sw_service_traffic" : {
"aliases" : { },
"mappings" : {
"properties" : {
"timestamp" : {
"type" : "date"
},
"serviceId" : {
"type" : "long"
},
"serviceInstanceName" : {
"type" : "keyword"
}
}
},
"settings" : {
"index" : {
"creation_date" : "1696210222573",
"number_of_shards" : "3",
"number_of_replicas" : "1",
"uuid" : "example-uuid",
"version" : {
"created" : "8000099"
},
"provided_name" : "sw_service_traffic"
}
}
}
}
在这个例子中,sw_service_traffic 索引已经成功创建,并且具有正确的设置和映射。