Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 当bigquery的查询结果为空时(使用pthon),如何使用gcp stackdriver收集日志?_Python 3.x_Google Cloud Platform_Google Bigquery_Google Cloud Functions_Google Cloud Stackdriver - Fatal编程技术网

Python 3.x 当bigquery的查询结果为空时(使用pthon),如何使用gcp stackdriver收集日志?

Python 3.x 当bigquery的查询结果为空时(使用pthon),如何使用gcp stackdriver收集日志?,python-3.x,google-cloud-platform,google-bigquery,google-cloud-functions,google-cloud-stackdriver,Python 3.x,Google Cloud Platform,Google Bigquery,Google Cloud Functions,Google Cloud Stackdriver,我有一个云函数,它执行查询并将作业结果存储到新的bigquery表中。每当我得到查询作业结果为空时,我想将日志存储到stackdriver中,这意味着找不到特定查询执行的记录。谁能建议我如何完成这项任务 云功能代码: def main(request): query = "select * from `myproject.mydataset.mytable`" client = bigquery.Client() job_config = bigquery.QueryJ

我有一个云函数,它执行查询并将作业结果存储到新的bigquery表中。每当我得到查询作业结果为空时,我想将日志存储到stackdriver中,这意味着找不到特定查询执行的记录。谁能建议我如何完成这项任务

云功能代码:

def main(request):

    query = "select * from `myproject.mydataset.mytable`"
    client = bigquery.Client()
    job_config = bigquery.QueryJobConfig()
    dest_dataset = client.dataset(destination_dataset, destination_project)
    dest_table = dest_dataset.table(destination_table)
    job_config.destination = dest_table
    job_config.create_disposition = 'CREATE_IF_NEEDED'
    job_config.write_disposition = 'WRITE_APPEND'
    job = client.query(query, location='US', job_config=job_config)
    job.result()
  • 转到GCP控制台中的Stackdriver日志部分
  • 激活高级过滤器(单击过滤器字段右侧的箭头)
  • 用以下内容填充自定义字段:
这样,您只选择等于0的总结果。诀窍在于缺少totalResults,结果为0。使用这种语法,就可以了

然后可以创建到BigQuery、Storage或PubSub的导出,或者创建度量。如果您这样做,那么您可以在Stackdriver监视和警报中使用此度量。一切都取决于你想用什么来做。

  • 转到GCP控制台中的Stackdriver日志部分
  • 激活高级过滤器(单击过滤器字段右侧的箭头)
  • 用以下内容填充自定义字段:
这样,您只选择等于0的总结果。诀窍在于缺少totalResults,结果为0。使用这种语法,就可以了


然后可以创建到BigQuery、Storage或PubSub的导出,或者创建度量。如果您这样做,那么您可以在Stackdriver监视和警报中使用此度量。所有这一切都取决于您想做什么。

您必须使用代码或使用GCP日志UI在中创建日志

在将日志传递给bigquery的过程中编写代码

private static MonitoredResource monitoredResource = 
MonitoredResource.newBuilder("global")
  .addLabel("project_id", logging.getOptions().getProjectId())
  .build();

public static void writeLog(Severity severity, String logName, Map<String, String> jsonMap) {
List<Map<String, String>> maps = limitMap(jsonMap);
for (Map<String, String> map : maps) {
  LogEntry logEntry = LogEntry.newBuilder(Payload.JsonPayload.of(map))
      .setSeverity(severity)
      .setLogName(logName)
      .setResource(monitoredResource)
      .build();
  logging.write(Collections.singleton(logEntry));
}
private static MonitoredResource MonitoredResource=
MonitoredResource.newBuilder(“全球”)
.addLabel(“项目id”,logging.getOptions().getProjectId())
.build();
公共静态void writeLog(严重性、字符串日志名、映射jsonMap){
列表映射=limitMap(jsonMap);
用于(地图:地图){
LogEntry LogEntry=LogEntry.newBuilder(Payload.JsonPayload.of(map))
.setSeverity(严重性)
.setLogName(logName)
.setResource(监视器资源)
.build();
logging.write(Collections.singleton(logEntry));
}

您必须使用代码或GCP日志UI在中创建日志

在将日志传递给bigquery的过程中编写代码

private static MonitoredResource monitoredResource = 
MonitoredResource.newBuilder("global")
  .addLabel("project_id", logging.getOptions().getProjectId())
  .build();

public static void writeLog(Severity severity, String logName, Map<String, String> jsonMap) {
List<Map<String, String>> maps = limitMap(jsonMap);
for (Map<String, String> map : maps) {
  LogEntry logEntry = LogEntry.newBuilder(Payload.JsonPayload.of(map))
      .setSeverity(severity)
      .setLogName(logName)
      .setResource(monitoredResource)
      .build();
  logging.write(Collections.singleton(logEntry));
}
private static MonitoredResource MonitoredResource=
MonitoredResource.newBuilder(“全球”)
.addLabel(“项目id”,logging.getOptions().getProjectId())
.build();
公共静态void writeLog(严重性、字符串日志名、映射jsonMap){
列表映射=limitMap(jsonMap);
用于(地图:地图){
LogEntry LogEntry=LogEntry.newBuilder(Payload.JsonPayload.of(map))
.setSeverity(严重性)
.setLogName(logName)
.setResource(监视器资源)
.build();
logging.write(Collections.singleton(logEntry));
}

您可以尝试使用结果中的属性,类似于
r=job.result();如果r.total\u rows==0:stack\u client.send\u log()
@WillianFuks基于您的建议,我对代码做了一些修改,它给出了我期望的结果。下面是代码:logging\u client=logging.client()log\u name='bigquery logs'logger=logging\u client.logger(log\u name)如果r.total\u行为None:logger.log\u text(“接收到的空查询结果”),您可以尝试使用结果中的属性,例如
r=job.result();如果r.total\u行==0:stack\u client.send\u log()
@WillianFuks根据您的建议,我对代码做了一些修改,它给了我我所期望的。下面是代码:logging\u client=logging.client()log\u name='bigquery logs'logger=logging\u client.logger(log\u name),如果r.total\u行为None:logger.log\u text(“收到空查询结果”)我按照您的方式尝试了它,但在我的情况下,它并没有给我期望的输出。我在过滤器中填充自定义字段后尝试的代码是:logging\u client=logging.client()log\u name='bigquery logs'logger=logging\u client.logger(log\u name)try:job.result()r=job.result(),如果r.total\u rows==0:logger.log\u text(“收到空查询结果”),除了RuntimeError:print(client1.report_exception())Note=作为测试的一部分,我在查询中使用空表。我按您的方式尝试了它,但在我的情况下,它没有给我所需的输出。在填充筛选器中的自定义字段后,我尝试的代码是:logging_client=logging.client()log\u name='bigquery logs'logger=logging\u client.logger(log\u name)try:job.result()r=job.result()如果r.total\u rows==0:logger.log\u text(“收到的空查询结果”),除了运行时错误:print(client1.report\u exception())注意=作为测试的一部分,我在查询中使用空表。