我已经在 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/
我正在用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.
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我有一个这样的哈希数组:[{: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
我知道我可以指定某些字段来使用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
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我想获取模块中定义的所有常量的值: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
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出