想要轻松地通过许多不同的方式查询数据,甚至是从未预料到的方式?想要以多种方式可视化日志?同时支持基于时间、文本和其他类型的即时过滤器?借助于Elasticstack 的卓越性能和可扩展方式的优点,我们将通过两个示例轻松实现。本文由DNC Magazine for Developers and Architects发布。从这里下载此杂志[PDF] 或免费订阅本杂志下载所有以前和当前的版本版本。在这篇文章中,我将介绍流行的搜索引擎 Elasticsearch,其配套的可视化应用 Kibana,并展示如何对.NET核心可以轻松地与 Elastic stack 整合在一块。
Elasticsearch和.Net Core
我们将开始探索 Elasticsearch 的 REST API ,通过索引和查询某些数据。接着,我们将使用Elasticsearch官方的 .Net API 完成类似的练习。一旦熟悉 Elasticsearch 及其 API 后,我们将使用 .Net Core 创建一个日志模块,并将数据发送到 Elasticsearch 。Kibana紧随其中,以有趣的方式可视化 Elasticsearch 的索引数据。
我迫切希望你会认为这篇文章十分有趣,并且想要了解更多关于Elastic的强大之处。本文假设您已经了解 C#和 REST API 的基本知识。使用 Visual Studio,Postman 和 Docker 等工具,但您可以轻松使用 VS Code 和 Fiddler 等替代方案。Elasticsearch 作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST API 来搜索数据。它使用 Java 编写,基于Apache Lucene,尽管这些细节隐藏在 API 中。
通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。
但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。
快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB 级索引数据。同时作为 Elastic stack (aka ELK) 的核心,提供了诸如 LogStash、Kibana 和更多的强大应用。
Kibana是 Elasticsearch 中专门提供强有力的可视化查询Web应用程序。使用Kibana,能非常简单地为 Elasticsearch 中索引的数据创建查询、图表和仪表盘。
Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP 调用,你可以尝试使用 curl 或 postman 等工具。当然,这个 API 的客户端已经用许多不同的语言编写,包括.Net、Java、Python、Ruby和JavaScript等。
如果你想阅读更多,Elasticsearch官方网站可能是最好的地方。在这篇文章中,我们需要先连接到一个 Elasticsearch (和后面的Kibana)的服务器。如果您已经有一个在本地运行或可以使用的服务器,那很好。否则需要先搭建一个服务器。
您可以选择在您的本地机器或可以使用的 VM 或服务器中下载和安装 Elasticsearch 和 Kibana 。不过,建议您使用最简单最纯粹的方式,使用Docker 搭建 Elasticsearch 和 Kibana 。
您可以直接运行以下命令,获取包含Elasticsearch和Kibana的容器。-it 表示以交互模式启动容器,并附加到终端。–rm 表示从终端退出后,容器将被移除。-p 将容器中的端口映射到主机中的端口–name 给容器一个名称,当您不使用的情况下可以用 –rm 手动停止/删除nshou/elasticsearch-kibana 是Docker Hub中的一个镜像的名称,已经有人帮你准备好了Elasticsearch和Kibana如果你喜欢在后台运行的话,你可以使用参数-d 代替 –it –rm,并且手动停止/删除容器。在同一个容器中运行多个应用程序,就像我们现在这种做法,非常适用本文,但不是推荐用于生产容器!您应该意识到,一旦你删除容器,你的数据就会消失(一旦你使用-rm选项就删除它了)。虽然有利于本地实验,但在实际环境中,如果您不想丢失数据,请参照 “data container” 模式。Docker是一个很棒的工具,我鼓励你更多地了解它,特别是如果你想做更重要的事情,而不仅仅是跟随本文,在本地快速搭建 Elasticsearch 服务器。在之前的文章Building DockNetFiddle using Docker and .NET C开发云主机域名ore中已经对 .NET Core 搭配 Docker 有很好的介绍。只需打开http://localhost:9200和http://localhost:5600,检查Elasticsearch 和 Kibana 是否都可以使用。(如果您使用docker toolbox,请使用托管Docker的虚拟机ip替换localhost,您可以在命令行中运行 docker-machine env default )。
在docker中运行 Elasticsearch
kibana也准备好了在我们开始编写任何 .Net 代码之前,我们先了解一下一些基本知识。先在 Elasticsearch 索引一些文档(类似于存到数据库),以便我们对它们运行不同的查询。在这里,我将使用Postman向我们的 Elasticsearch 服务器发送 HTTP 请求,但您可以使用任何其他类似的工具,如Fiddler或curl。我们要做的第一件事是请求 Elasticsearch 创建一个新的索引 (译者语:类似创建一个表) 并索引一些文档 (译者语:类似于在数据中插入数据) 。这类似于将数据存储在表/集合中,主要区别(和目的)是让 Elasticsearch 集群 (这里只是一个节点) 可以分析和搜索文档数据。
被索引的文档在 Elasticsearch 中以索引和类型进行组织。以往,被拿来和数据库表做对比,往往会令人困惑。如这篇文章所述,索引由Lucene处理,在分布式跨分片中,与类型紧密地联系在一起。
发送以下两个请求以创建索引,并在该索引中插入文档 (请记住 toolbox,如果使用docker ,请使用托管Docker的虚拟机ip而不是localhost) :创建一个名为 “default” 的新索引。在 “default” 索引中索引文档。请注意,我们需要知道我们存储哪种类型的文档(”product”)和该文档的ID (如 1,尽管您可以使用任何值,只要它是唯一的)
创建一个新索引
索引新文档
在我们验证搜索功能和查询数据之前,再索引几个 “product”。尝试使用不同的 “tags”,如 “laptops”和 “laptops”,并记得使用不同的ids!
完成后,让我们按名称排序的搜索所有被索引的文档。您可以使用查询字符串或 GET/POST 同样的内容,下面两个请求是等效的:让我们尝试一些更有趣的东西,例如搜索 “description” 字段中含有 “latest” ,同时 “tags” 字段中含有 “laptops” 的所有文档:
搜索结果作为介绍的最后部分,我们将对 Kibana 的相关知识蜻蜓点水。
假设您在上一步已经索引了几个文档,通过访问http://localhost:5601中打开在 Docker 的 Kibana 服务器。你会注意到,Kibana 要求你提供默认的索引模式,所以必须告诉它使用的 Elasticsearch 索引:我们在上一节中创建了一个名为 “default” 的索引,因此可以使用“default”作为索引模式。您还需要取消 “索引包含基于时间的事件 (Index contains time-based events ) ” 选项,因为我们的文档不包含任何时间字段。
在 Kibana 中添加索引模式
完成后,使用左侧菜单打开 ” 发现 (Discover) ” 页面,您应该会看到上一节中插入的所有最新文档。尝试选择不同的字段,在搜索栏中输入相关的字段或某个过滤器:
在 kibana 中可视化数据
最后,我们创建一个饼图,显示 “laptops” 或 “desktops” 的销量百分比。利用之前索引的数据,在左侧菜单新建一个 “饼图 (Pie Chart)” 。
您可以在 饼图 (Pie Chart)的页面上配置。将 ” Count ” 作为切片的大小,并在 ” buckets ” 部分中选择 ” split slices ” 。将 ” filters ” 作为聚合类型,添加两个过滤器:tags =”laptop” 和 tags =”desktoptops” 。单击运行,您将看到类似于下图:
在Kibana中创建饼图
确保在搜索栏中输入包含已过滤的项目的搜索关键词,并注意到可视化图形如何变化。在简要介绍Elasticsearch和Kibana之后,我们来看看我们如何用 .Net 应用程序索引和查询我们的文档。
您可能想知道为什么要这样做,而不是直接使用 HTTP API 。我可以提供几个理由,我相信你可以自己找几个:你不想直接暴露 Elasticsearch 集群Elasticsearch 可能不是您的主数据库,您可能需要结合来自主数据库的结果。你希望包含来自存储/生产服务器中的被索引文档首先需要注意的是打开这个文档,有两个官方提供的 APIs :Elasticsearch.Net和NEST,都支持 .Net Core 项目。Elasticsearch.Net 提供了一个用于与 Elasticsearch连接的低级API,提供构建/处理请求和响应的功能。它是 .Net 瘦客户端。NEST 在 Elasticsearch.Net 之上,提供了更高级别的 API 。它可以将对象映射到请求/响应中,提供强大查询功能,将索引名称、文档类型、字段类型用于构建与 HTTP REST API 的匹配查询。
Elasticsearch .Net API由于我使用的是 NEST,所以第一步是创建一个新的 ASP .Net Core 应用程序,并使用 Package Manager 安装NEST。我们将在新的 ASP.Net Core 应用程序中完成之前手动发送 HTTP 请求的一些步骤。如果需要,请重新启Docker 容器,从而清理数据;或通过 HTTP API 和 Postman 手动删除文档/索引。
我们首先为产品创建一个POCO模型:接下来,我们创建一个新的控制器 ProductController,它具有添加新的 “Product” 的方法和基于单个关键词查找 “Product” 的方法:为了实现这些方法,我们需要先连接到 Elasticsearch。这里有一个 ElasticClient 连接的正确示范。 由于该类是线程安全的,所以推荐的方法是在应用程序中使用单例模式,而不是按请求创建新的连接。为了简洁起见,我现在将使用带有硬编码设置的私有静态变量。在 .Net Core 中使用依赖注入配置框架,或查看Github中的代码。可以想到的是,至少需要提供被连接的 Elasticsearch 集群的URL。当然,还有其他可选参数,用于与您的群集进行身份验证、设置超时、连接池等。建立连接后,索引文档只是简单地使用 ElasticClient 的Index/IndexAsync 方法:很简单,对吧?不幸的是,如果您向Postman发送以下请求,您将看到失败。这是因为NEST无法确定在索引文档时使用哪个索引!如果您想起手动使用 HTTP API 的做法,那么需要在URL指出文档的索引、文档的类型和ID,如localhost:9200/default/product/1NEST能够推断文档的类型(使用类的名称),还可以默认对字段进行索引(基于字段的类型),但需要一些索引名称的帮助。您可以指定默认的索引名称,以及特定类型的特定索引名称。进行这些更改后再试一次。您将看到 NEST 创建索引(如果尚未存在),并将文档编入索引。如果你切换到 Kibana,你也可以看到该文档。需要注意的是:从类的名称推断文档类型,如 Product在类中将Id属性推断为标识将所有公开的属性发送到 Elasticsearch
使用NEST索引的文档
在我们查询数据之前,重新考虑创建索引的方式。
如何创建索引?
现在我们得到一个事实,即如果这个索引不存在,也会被创建。然而映射字段的索引方式很重要,并直接定义了 Elasticsearch 如何索引和分析这些字段。这对于字符串字段尤其明显,因为在 Elasticsearch v5 中提供了两种不同字段类型的 “Text” 和 “Keyword”:Text 类型的字段将会被分析和分解成单词,以便用于更高级的 Elasticsearch 搜索功能另一方面,Keyword 字段将 “保持原样” 而不进行分析,只能通过其精确值进行搜索。您可以使用 NEST 索引映射属性来生成POCO模型:然而,我们需要先创建索引,必须使用 ElasticClient API 手动创建和定义索引的映射。这是非常简单的,特别是如果我们只是使用属性:直接向Elasticsearch发送请求(GET localhost:92000/default),并注意与我们想要的映射是否相同。
使用NEST创建索引映射现在,我们有一个使用 NEST 对 “products” 进行索引的 ProductController 控制器。是时候,为这个控制器添加 Find action,用于使用 NEST 向 Elasticsearch 查询文档。
我们只是用到一个字段来实现一个简单的搜索。您应该观察所有字段:映射为“Text”类型的字段可以被分析,您可以在 “name” / “description” 字段内搜索特定的单词映射为“Keywords”的字段是保持原样的,未进行分析。您只能在 “tags” 字段中完全匹配。NEST 提供了一个查询 Elasticsearch 的丰富 API,可以转换成标准的 HTTP API 。实现上述查询类型与使用Search/SearchAsync方法一样简单,并构建一个 SimpleQueryString 作为参数。使用PostMan测试您的新操作:
使用nest查询
正如您可能已经意识到的那样,我们的操作行为与手动发送请求到 Elasticsearch 一样:现在我们了解了 NEST 的一些基础知识,让我们尝试一些更有野心的事情。我们已经创建了一个 ASP.Net Core 的应用程序,借助.NET Core的日志框架,实现我们的日志提供程序,并将信息发送到Elasticsearch。
新的日志 API 在日志 (logger) 和日志提供程序 (logger provider) 方面的区别:日志 (logger) 记录信息和事件,如用于控制器中可以为应用程序添加并启用多个日志提供程序 (provider) ,并可以配置独立的记录级别和记录相应的信息/事件。该日志框架内置了一些对事件日志、Azure 等的日志提供程序 (provider),但正如您将看到的,创建自己的并不复杂。有关详细信息,请查阅.NET Core 关于日志的官方文档。
在本文的最后部分,我们将为Elasticsearch创建一个新的日志提供程序,在我们的应用程序中启用它,并使用Kibana来查看记录的事件。首先要做的是定义一个新的POCO对象,我们将使用它作为使用NEST进行索引的文档,类似于之前创建的 “Product” 类。
这将包含有关可能发生的任何异常以及相关请求数据的记录信息、可选信息。记录请求数据将会派上用场,因为我们可以根据具体请求查询/可视化我们记录的事件。下一步是在一个新类上实现ILogger接口。如您所想,这将需要记录的数据映射到一个新的 LogEntry 对象,并使用 ElasticClient 对其进行索引。我们将使用IHttpContextAccessor,以便我们可以获取当前的HttpContext并提取相关的请求属性。在这里就不写连接到Elasticsearch并创建索引的代码,这与之前的操作,没有什么不同。使用不同的索引或删除上一节中索引的 “products” 。注意:您可以使用依赖注入和配置文检查Github中的配套代码。实现的主要方法是Log
这可能派上用场,例如为不同的类设置不同的日志级别,以过滤/查询记录的事件。我相信您可能还想到更多的用法。
首先,在Kibana中重建索引,这次确保选择”Index contains time-based events ( Index包含基于时间的事件 )“,选择字段dateTime作为”Time-field name (时间字段名称)”。
接下来,启动您的应用程序,浏览一些页面以获取一些事件日志。还可以在某个端点随意添加抛出异常的代码,以便我们可以看到被记录的异常数据。
在这之后,请转到Kibana的发现 (Discover)页面,您可以看到由 “dateTime” 字段排序的多个事件(默认情况下,数据被过滤为最近15分钟,但您可以在右上角更改):
Kibana可视化中记录的事件
试着在搜索栏中输入 “exception”,并注意任何一个被分析的文本字段中包含 “exception” 的事件。然后尝试搜索特定的异常类型(记住我们使用了一个关键字字段!)。
您还可以尝试搜索特定的URL,如以 ” /Home/About “和” /Home/About” 路径的两种搜索方式 。您会注意到第一种情况包括引用者是 “/Home/About” 的事件,而第二种情况则只能正确返回路径为 “/Home/About” 的事件。
一旦你熟悉了数据,以及如何查询数据,那么可以用数据创建一些有趣的图形。
首先,我们将创建一个图表,显示每分钟记录的异常数。转到Kibana的可视化 (Visualize)页面,并创建一个新的垂直条形图 (Vertical bar chart)。选择Y轴作为计数,X轴上为日期的直方图。将间隔设置为每分钟,最后在搜索框中添加一个过滤器 “hasException:true” 。一个很棒的图表,显示每分钟记录的异常数目:
每分钟记录的异常数目
接下来,显示每个 category 随时间记录的消息数量,限于前5个 category :转到Kibana的可视化 (Visualize)页面,并创建一个新的线型图 (Line chart)。再次选择Y轴作为计数,X轴上为日期的直方图,选择dateTime作为字段,间隔为每分钟。现在添加一个 sub-bucket 并选择 “split lines” 。使用 “significant terms” 作为聚合,category 为字段,单位为5个。这将绘制类似于以下的图表:
随着时间的推移
尝试在搜索框中添加一些过滤器,并查看它对结果的影响。
最后,我们添加另一个图表,我们将看到前五个出现最多的消息和前五个 categories 的消息。转到Kibana的可视化 (Visualize)页面,并创建一个新的饼图 (Pie chart)。像之前一样,选择Y轴的计数现在,将 “Terms” 作为聚合,将 “category” 作为字段,数量作为单位,限制前五个,画出图表。然后将 “Terms” 作为聚合来分割切片,”message.keyword” 作为字段,数量作为单位,限制前五个。
一旦你有了这些设置,你会看到一个类似于这个图表:
每个 category 中最常见的消息
花时间观察下数据(百分比,message/category 显示在图表元素上)。例如,您将观察到由
DeveloperExceptionPageMiddleware类记录的异常。Elasticsearch是一个强大的数据索引和查询平台。虽然它本身相当令人印象深刻,但与其他应用程序(如Kibana)相结合,可以很好地分析、报告和可视化数据。只要您开始使用,只是蜻蜓点水都能的到非凡的结果。
对于 .Net 和 .Net Core,Elasticsearch 官方的 API 已经覆盖,因为它们支持 .Net Standard 1.3和更高版本(他们仍然在为1.1提供支持)。
正如我们已经看到的,在 ASP.Net Core 项目中使用这个 API 是很方便的,我们可以轻松地将其 REST API 作为存储,以及在应用程序中作为日志提供程序。
最后但并非不重要的一点,我希望您使用Docker。尝试使用 Elasticsearch,同时思考Docker可以为您和您的团队做些什么。
随着互联网的发展,越来越多的的人进入了IT行业,那么什么样的香港云主机比较好?你们知道吗?为了让大家更加了解香港云主机,小编给大家总结了以下内容,一起往下看吧。其中,开发云香港163线路和cn2线路使用全球国际IP骨干网络,163线路支持独立IP,免备案;cn…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。