草庐IT

javascript - Nagios JSON 查询返回不正确的值

coder 2024-07-16 原文

我已经在 Linux 服务器上安装了 Nagios(Nagios® Core™ 版本 4.2.2)。我一直在使用 JSON 查询生成器生成 JSON 格式的可用性报告。它将提供一个 API。我创建了一个 Javascript,它将把这个 URL 传递给 Ajax 调用,并根据成功结果,在我们自己的仪表板中打印百分比。

JSON URL : http://xx.xx.xx.xx/nagios/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=ALM&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=1514297016&endtime=1514383416

开始和结束时间包含 EPOCH 格式的时间。

在 Javascript 中,我创建了一个函数,它将开始和结束时间作为变量传递给 URL。

var time = new Date();
var end = Math.floor((new Date).getTime() / 1000);
//var end = ~~(Date.now() /1000) ;
var start = Math.floor(time.setDate(time.getDate() - 1) / 1000);
Availreport = "http://xx.xx.xx.xx/nagios/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=ALM&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=" + start + "&endtime=" + end;

$.ajax({
  url: Availreport,
  timeout: 30000,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization',
      make_base_auth("nagiosadmin", "nagiosadmin"));
  },

  dataType: 'json', //data format
  success: onOutboundReceived //on receive of reply

});

在浏览器中,当我检查仪表板时,time_up json 键给出了不正确的值(值为 0)。直接在浏览器中执行时,相同的 URL 会给出正确的输出。

我该如何解决这个问题?

最佳答案

我尝试使用我自己的 Nagios XI 5.4.11 安装(您没有引用任何特定版本)并且我没有发现获得的可用性报告有任何差异,直接从 UI在浏览器中调用 API使用 JS 脚本

所以我无法重现您的问题,但仅供引用和帮助调试,下面是我成功用于从 Nagios API archivejson.cgi?query=availability 获取正确 JSON 答案的片段>.

该脚本使用两种身份验证方式,第一种,凭据直接在 url 中传递,非常不安全:

var time = new Date();
var end = Math.floor((new Date).getTime() / 1000);
var start = Math.floor(time.setDate(time.getDate() - 1) / 1000);

var user = "admin";
var pwd = "admin";

var baseurl = "mynagioshost:443/nagios";

var url1 = "https://"+user+":"+pwd+"@"+baseurl+"/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=application-servers&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=" + start + "&endtime=" + end;
var url2 = "https://"+baseurl+"/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=application-servers&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=" + start + "&endtime=" + end;

function go1() {
	$.support.cors = true;

	$.ajax({
		url: url1,
		timeout: 30000,
		crossDomain: true,
		dataType: 'json', //data format
		success: function(data) {
			console.log("success: ", data);
			$("#resp1").html(JSON.stringify(data, null, 2));
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			console.log("error: ", errorThrown);
		}
	});
}

function go2() {
	$.support.cors = true;

	$.ajax({
		url: url2,
		timeout: 30000,
		crossDomain: true,
		xhrFields: {
			withCredentials: true
		},
		beforeSend: function(xhr) {
			var auth = make_base_auth(user, pwd);
			console.log("beforeSend: ", auth);
			xhr.setRequestHeader('Authorization', auth);
		},
		dataType: 'json',
		success: function(data) {
			console.log("success: ", data);
			$("#resp2").html(JSON.stringify(data, null, 2));
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			console.log("error: ", errorThrown);
		}
	});
}

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  // Base64 encoding for basic auth encoding username:password
  var hash = btoa(tok);
  // return the auth header
  return "Basic " + hash;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="btn1" onclick="go1()">get report - mode1</button>
<br>
<button id="btn2" onclick="go2()">get report - mode2</button>
<br>
<table>
  <tr>
    <td style="width: 45%">
      <pre id="resp1"></pre>
    </td>
    <td style="width: 45%">
      <pre id="resp2"></pre>
    </td>
  </tr>
</table>

正如已经说明的那样,从 API 接收到的数据无论如何都是相同的(显然除了时间之外)并且大致是这样的:

{
  "format_version": 0,
  "result": {
    "query_time": 1515654147000,
    "cgi": "archivejson.cgi",
    "user": "nagiosadmin",
    "query": "availability",
    "query_status": "released",
    "program_start": 1512375100000,
    "last_data_update": 1515651099000,
    "type_code": 0,
    "type_text": "Success",
    "message": ""
  },
  "data": {
    "selectors": {
      "availabilityobjecttype": 4,
      "starttime": 1515567802000,
      "endtime": 1515654202000,
      "hostgroup": "application-servers",
      ...OMISSIS...
    },
    "hostgroup": {
      "name": "application-servers",
      "hosts": [
        {
          "name": "192.168.2.20",
          "time_up": 86345,
          "time_down": 22,
          "time_unreachable": 0,
          "scheduled_time_up": 0,
          "scheduled_time_down": 0,
          "scheduled_time_unreachable": 0,
          "time_indeterminate_nodata": 0,
          "time_indeterminate_notrunning": 0
        },
        ...OMISSIS...
      ]
    }
  }
}

关于javascript - Nagios JSON 查询返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47994352/

有关javascript - Nagios JSON 查询返回不正确的值的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  3. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  4. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  7. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  8. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  9. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  10. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

随机推荐