5分钟,通过Microsoft Flow管道磁带应用程序分析
现在,让我告诉你为什么这个前言本不是一个好主意,因为它不是。
对于我非常具体的用例,我想跟踪我的桌面(VB.NET ……我知道,我正在学习C#)应用程序是在客户端计算机上启动的,以及在使用过程中发生的任何错误。我不需要任何重要的分析,而且我没有能力构建RESTful API端点来接收分析(企业网络等)。此外,没有多少人会使用该应用程序。
理想情况下,可以构建一个可以使用Django,RoR或任何其他Web框架处理这些请求的API。它真的是要走的路,因为它更加灵活,你可以提供大量的资源,而且真的……这是一个漂亮的管道胶带,超强力的解决方案。
另一方面,我需要一个快速而肮脏的解决方案来测试我的概念证明,并且没有足够的资源来设置Web服务器。所以,不用多说,我的解决方案!
首先,使用“ 收到HTTP请求时”触发器创建新流。
列表中的第一个!
您可以为流指定所需的任何JSON模式。目前,我有以下架构:
datetime - 这个应该是相对不言自明的。
type - 目前我有两种类型的分析:boot – 用于应用程序启动时发送的分析,以及错误 - 用于发生错误时发送的分析。
error_message - 也很明显不言自明。
error_value - 发生错误的堆栈跟踪。
application_version - 再次,是的。
ip - 实际上用于操作系统版本(我需要更改它,我知道)
guid - 应用程序生成的通用标识符(可以轻松跟踪有多少用户发送分析)
{
“datetime”: “3/28/2019 9:16:58PM”,
“type”: “boot”,
“error_message”: “”,
“error_value”: “”,
“application_version”: “1.1.0.0”,
“ip”: “Microsoft Windows NT 6.1.7601 Service Pack 1”,
“guid”: “bc6a61af-5ddf-4cb3-a9dc-b734b4c93957”
}
我的示例有效负载,注意我不可思议的懒惰,没有将ip更新为相关的名称,如版本。
您可以快速将样本JSON有效负载放在一起并将其提供给Flow触发器。它会生成它自己的架构来处理它,它有多整洁!
转储示例JSON有效内容后,您的流应该是什么样子。(注意:在保存项目之前,不会填写HTTP POST URL)
现在,所有要做的就是将数据放入您想要使用的任何存储介质中!Flow具有Postgres,MySQL,SQL Server,一堆Azure内容的连接器,甚至更多。您甚至可以使用本地数据网关将本地SQL Server实例连接到流!(https://docs.microsoft.com/en-us/power-bi/service-gateway-onprem)。
为了这个例子,我创建了一个SharePoint列表来快速存储数据。但严肃地说,这些数据应存储在某种适当的数据库中。
SharePoint列表的示例模式。不要使用SharePoint,它绝对不是存储这些数据的正确方法!
将流量连接到您选择的数据存储也非常容易。只需从列表中选择它,您就可以神奇地显示示例模式中的所有JSON对象,以便将它们添加进来!
非常简单!
我还使流程在成功接收请求后返回HTTP状态代码200。它位于数据存储的并行分支上。您可以让它返回您想要的任何内容,但是我保持简单,因为应用程序确实不需要从服务器获取任何数据。
返回… .Success的HTTP状态代码200!
所以,在你完成所有这些之后,你应该准备好节省流量。这将生成可用于POST到流的URL。如果提交的JSON模式与提供的样本有效负载不匹配,则流程甚至会返回4XX状态代码,以便让您知道出现问题!如果您已经按照这个快速教程进行操作,那么您的流程应该类似于此(除非没有SharePoint!):
希望你的流程与此非常相似!
您现在可以启动您喜欢的编程语言,或Postman来测试API端点!Postman非常方便您测试您的新奇,管道胶带的想法是否有效。只需复制并粘贴保存流时生成的HTTP POST URL,然后将示例模式粘贴到请求正文中,如下所示:
包含我的样本有效负载的POST请求 服务器响应HTTP状态码200!成功!
如果您查看存储数据的任何位置,您应该会看到一个包含您发送到服务器的数据的新条目!
双重成功!有用!
您还可以实时测试流量,并调查早期弹出的任何问题。只需按下右上角的测试按钮,然后使用Postman发送POST。
好哇!
就是这样。管道胶带分析在5分钟以内!你也可以使用Flow做更多的事情。您可以在其中添加一些if语句来分隔不同类型的分析并将它们存储在不同的表中,或者在发出特定类型的请求时将通知发送到您的电子邮件。天空是极限!
但是要警惕这种方法的缺陷。它绝对不是为大量数据而设计的,我不确定该URL是否是100%静态的。无论哪种方式,只要您认识到陷阱,这对于一些简单的分析来说就是一个简单的解决方案。
示例代码
下面是VB和Python中用于项目的一些示例代码!
快乐编码:)
Public Class ApplicationTracking
Public Sub New()
‘Do nothing, I’m sure you could do something neat here 🙂
End SubPublic Async Function Post(Optional callType As String = “boot”, Optional errorMsg As String = “”, Optional errorVal As String = “”) As Task(Of Net.HttpStatusCode)
‘Generates JSON POST string
Dim url As String = “YOUR MICROSOFT FLOW URL HERE”
Dim postData As String = “””datetime””: “”{0}””, “”type””: “”{1}””, “”error_message””: “”{2}””, “”error_value””: “”{3}””, “”application_version””: “”{4}””, “”ip””: “”{5}””, “”guid””: “”{6}”””
postData = String.Format(postData, DateTime.Now.ToString(), “boot”, errorMsg, errorVal, “1.1.0.0”, Environment.OSVersion, My.Settings.Guid)
postData = “{” & postData & “}”‘Generates Request content w/ JSON string
Dim content As New Net.Http.StringContent(postData, Text.Encoding.UTF8, “application/json”)
content.Headers.ContentType = New Net.Http.Headers.MediaTypeHeaderValue(“application/json”)‘Sends the POST and returns the HTTP Status Code
Using client As New System.Net.Http.HttpClient
Dim r As Net.Http.HttpResponseMessage = Await client.PostAsync(url, content)
Return r.StatusCode
End Using
End Function
End Class
用于跟踪的VB.NET类(需要引用System.Web.Extensions)
import requests
import datetime as dt
import platformclass AppAnalytics:
def __init__(self):
#Nothing at the moment 🙂
passdef post(self, guid, post_type=’boot’, error_message=”, error_value=”, app_version=’1.1.0.0′):
payload = {
‘datetime’: dt.datetime.now().strftime(“%Y-%m-%d %H:%M:%S”),
‘type’: post_type,
‘error_message’: error_message,
‘error_value’: error_value,
‘application_version’: app_version,
‘ip’: platform.platform(),
‘guid’: str(guid)
}
flow_url = ‘YOUR FLOW URL HERE’
#Posts the payload to the url, requests automatically encodes the dictionary 🙂
r = requests.post(flow_url, json=payload)
#Returns the HTTP Status Code (You can use this to check it sent the data correctly)
return r.status_code
用于跟踪的Python类