来自文件的 C# Stackdriver Trace 凭据

Posted

技术标签:

【中文标题】来自文件的 C# Stackdriver Trace 凭据【英文标题】:C# Stackdriver Trace credentials from file 【发布时间】:2020-01-13 00:10:56 【问题描述】:

我使用带有 C#(dotnet 核心)的 Google 云 Stackdriver Trace API 并根据此article 工作。

我已经添加了所有需要的代码并想在本地尝试(在我的开发机器上)。由于我不是从 GCP 云运行,因此我创建了一个具有所需权限的新服务帐户。谷歌在文章中说:

GCP 客户端库使用应用程序默认凭据 (ADC) 来查找 您的应用程序的凭据。您通过以下方式提供这些凭据 设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量:

export GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

现在我的代码在达到这一点时失败了:

services.AddGoogleExceptionLogging(options =>

    options.ProjectId = Configuration["Stackdriver:ProjectId"];
    options.ServiceName = Configuration["Stackdriver:ServiceName"];
    options.Version = Configuration["Stackdriver:Version"];
);

带有消息:

System.InvalidOperationException: '读取凭证文件时出错 位置 C:******.json: 找不到文件。 请检查环境的值 变量 GOOGLE_APPLICATION_CREDENTIALS'

出于多种原因,我不想使用名为GOOGLE_APPLICATION_CREDENTIALS 的环境变量。相反,我正在寻找一种方法来为其提供实际文件路径,而不使用环境变量。

我该怎么做?

【问题讨论】:

【参考方案1】:

你正在使用的命令

出口 GOOGLE_APPLICATION_CREDENTIALS=path-to-your-service-accounts-private-key

在Linux中使用,但您的帖子指定的错误

.... 从位置 C:******.json 读取凭证文件时出错:可能 找不到文件.....

在这种情况下,您似乎使用的是 windows,您需要使用命令“SET”来分配值,位于“Setting the environment variable”段落中。

您还可以在代码中传递服务帐户密钥,在这种情况下,您需要安装Cloud Storage client library,您可以在段落“Passing the path to the service account key in code” 中查看示例,您可以在其中看到此 C# 代码,并且您有指向带有示例代码的 GitHub。

// Some APIs, like Storage, accept a credential in their Create()
// method.
public object AuthExplicit(string projectId, string jsonPath)

    // Explicitly use service account credentials by specifying
    // the private key file.
    var credential = GoogleCredential.FromFile(jsonPath);
    var storage = StorageClient.Create(credential);
    // Make an authenticated API request.
    var buckets = storage.ListBuckets(projectId);
    foreach (var bucket in buckets)
    
        Console.WriteLine(bucket.Name);
    
    return null;

// Other APIs, like Language, accept a channel in their Create()
// method.
public object AuthExplicit(string projectId, string jsonPath)

    var credential = GoogleCredential.FromFile(jsonPath)
        .CreateScoped(LanguageServiceClient.DefaultScopes);
    var channel = new Grpc.Core.Channel(
        LanguageServiceClient.DefaultEndpoint.ToString(),
        credential.ToChannelCredentials());
    var client = LanguageServiceClient.Create(channel);
    AnalyzeSentiment(client);
    return 0;

【讨论】:

您附加的代码是基于StorageClient的,在我提到的示例中-没有地方使用它(StorageClient 是一个使用示例,您可以查看这一行 "var credential = GoogleCredential.FromFile(jsonPath)" ,在该代码所在的同一页面中您可以查看一个按钮“在 GitHub 上查看”您可以在其中观察一个名为 AuthSample 的完整代码。 我在项目的其他地方熟悉该代码。但是在这里,我没有使用credential 变量的地方。使用 Storage 对象时,您有重载使用它 (StorageClient.Create(cred))【参考方案2】:

由于您不想使用环境变量,您是否尝试过使用 gcloud SDK 进行身份验证?

正如here 解释的那样:

如果在本地运行以进行开发/测试,您可以使用 Google Cloud SDK 进行身份验证。如果您还没有下载 SDK,然后在命令行中运行以下命令登录:

gcloud auth 应用程序-默认登录

否则,唯一的其他方法就是在源代码中指定路径。

您应该可以使用here 提供的示例来做到这一点。调整它以满足您的特定需求。

此示例展示了如何使用从 JSON 文件加载的凭据创建客户端:

using Google.Cloud.ErrorReporting.V1Beta1;
using Google.Apis.Auth.OAuth2;
using Grpc.Auth;
using Grpc.Core;
...
GoogleCredential cred = GoogleCredential.FromFile("/path/to/credentials.json");
Channel channel = new Channel(
    ReportErrorsServiceClient.DefaultEndpoint.Host, ReportErrorsServiceClient.DefaultEndpoint.Port, cred.ToChannelCredentials());
ReportErrorsServiceClient client = ReportErrorsServiceClient.Create(channel);
...
// Shutdown the channel when it is no longer required.
channel.ShutdownAsync().Wait();

【讨论】:

以上是关于来自文件的 C# Stackdriver Trace 凭据的主要内容,如果未能解决你的问题,请参考以下文章

来自 Python 应用的 Opencensus Stackdriver 跟踪未出现在 GCP 的跟踪列表中

如何将本地 Kubernetes 日志发送到 Stackdriver

将浏览器 JavaScript 错误发送到 Stackdriver 错误报告

使用gcloud创建Stackdriver Alert策略? (不从文件加载)

如何自定义 TRAC 插件模板 python 文件

Stackdriver 错误电子邮件通知未发送