我正在尝试将instana集成到应用程序中。更具体地说,我正试图将错误从我的角度应用程序发送到instana。我有我的代码“工作”,所以这是一个关于最佳实践的问题。
instana的Backend Correlation documentation根据我的理解定义了“window”中的函数。我在index.html中设置了类似的内容。

<script>
  (function(i,s,o,g,r,a,m){i['InstanaEumObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//eum.instana.io/eum.min.js','ineum');

  ineum('apiKey', 'someKey');
  ineum('traceId', 'backendTraceId'); //replace 'backendTraceId with the appropriate expression for retrieval
</script>

我遇到的问题是,当我试图遵循instana关于错误跟踪的指南时,他们会调用我可以从窗口访问的方法之一。指南直接调用函数ineum(...)本身。当我尝试这样做时,我的项目不会编译。
class CustomErrorHandler implements ErrorHandler {
  handleError(error) {
    ineum('reportError', error);

    // Continue to log caught errors to the console
    console.error(error);
  }
}

我现在的修复是:(<any>window).ineum('reportError', errorContext);但是我正在看Angular 2+ Integration他们在JavaScript中以不同的方式访问窗口。
“任何”的排版窗口是一个坏习惯吗?
是尝试window['ineum'](...)更好,还是只是一种语法偏好?
最好在另一个文件中定义函数,比如一个分类的instana服务,然后在index.html脚本和customerrorhandler中使用该服务,还是将其保留在窗口中?(尽管这个可能有点让我费解)
抱歉,我的困惑,这可能不是一个实际的问题,因为我的代码是'工作',但我只想澄清这一点。我不确定我是否只是没有正确遵循instana的指南,但这是我能找到的最好的。我试着通过他们的联系页面联系他们,但还没有收到回复。

最佳答案

instana有一个demo application来显示这一点。
总结你需要的部分:
确保在typescript配置中配置了允许定义自定义类型的本地目录:

// common file name: tsconfig.app.json
{
  // other configuration…
  "typeRoots": [
    // other configuration…
    "./custom-typings"
  ]
}

在该目录内的文件中声明全局ineum函数:
// common file name globals.d.ts
declare function ineum(s: string, ...parameters: any[]): any;

这两个步骤的组合将使typescript知道该函数。现在您可以像使用任何其他全局设置一样使用ineum

08-27 19:51