搜索​​​​

清除过滤器
文章
Jingwei Wang · 九月 20, 2022

FAQ常见问题系列 -- HA篇 虚拟化环境上的镜像问题

1. VMWare快照引起的网络中断导致非计划内主备机切换问题 1.1 问题描述 在创建虚拟机快照时,虚拟机需要短时间的冻结,这个短时间冻结通常指虚拟机静默,在静默过程中网络连接处于中断状态。由于数据库的不断增长,使用VMWare快照的方式对虚拟机进行备份的时长也会不断增加,当对虚拟机进行快照的时长长于InterSystems镜像服务质量 (QoS) 超时时间,即当主机网络中断超过QoS超时时间,仲裁机与备机观察并相互确认与主机的连接丢失后,将发起切换过程,使原备机成为主机并将虚拟IP从主机MAC地址解绑后重绑定到备机的MAC地址上。特别需要注意的是,在这种由于网络中断引起的切换中,仲裁与备机都无法得知主机的实际工作状态。因此,在主机网络连接恢复后,为了为了避免因切换期间主机还在处理数据导致主备机间数据不一致,备机主动发起请求让主机下线,关闭主机,此时主机状态显示为关闭(Down)。 1.2 解决方案 对于由于虚拟机快照引起的网络中断造成的非计划内主备切换问题,请参考以下两种解决方案: 使用数据库冻结/解冻脚本,具体脚本和操作方式请参考社区文章虚拟机备份和 Caché 冻结/解冻脚本,如有其他疑问请联系InterSystems WRC 在镜像集群中增加一个异步镜像成员,使用异步镜像成员创建虚拟机快照,由于此异步镜像成员也会同步获取主机数据,但是不会自动切换,所以在此异步镜像成员中创建虚拟机快照,既可以备份虚拟机,也不会引起非计划内主备机切换问题。 2. VMWare资源不足导致的主备机非计划内切换问题: 2.1 问题描述 当虚拟机的物理资源不足,可能会导致网络中断或者InterSystems IRIS 实例日志守护进程不响应超过 30 秒(或300 秒),导致主备非计划内切换。 2.2 解决方案 请扩展虚拟机的物理资源,且增加对虚拟机的状态进行监控,以防再次出现资源不足情况。 监控网络状态Log 由于网络中断造成的镜像主备切换是非计划内主备切换的重要原因之一,所以为了方便排查问题,可以在仲裁机上加一个ping的脚本,用来ping主机和备机,并将ping的结果放入log中,当发生非计划内主备切换时这个log有利于排查问题。也可以使用此ping脚本来监控网络状态,使用户能够第一时间获得网络状态信息。
文章
姚 鑫 · 五月 30, 2021

第十一章 发送和接收IBM WebSphere MQ消息

# 第十一章 发送和接收IBM WebSphere MQ消息 InterSystems IRIS为IBM `WebSphere MQ`提供了一个接口,可以使用该接口在InterSystems IRIS和IBM `WebSphere MQ`的消息队列之间交换消息。要使用此接口,必须能够访问IBM `WebSphere MQ`服务器,并且IBM `WebSphere MQ`客户端必须与InterSystems IRIS在同一台计算机上运行。 该接口由`%Net.MQSend`和`%Net.MQRecv`类组成,这两个类都是`%Net.abstractMQ`的子类。这些类使用由InterSystems IRIS在所有合适的平台上自动安装的动态链接库。(这是Windows上的`MQInterface.dll`;其他平台的文件扩展名不同。)。反过来,InterSystems IRIS动态链接库需要IBM `WebSphere MQ`动态链接库。 该界面仅支持发送和接收文本数据,不支持二进制数据。 # 使用IBM WebSphere MQ的RIS接口 通常,要使用IBM `WebSphere MQ`的InterSystems IRIS接口,请执行以下操作: 1. 确保有权访问`IBM WebSphereMQv7.x`或更高版本。具体而言: - IBM `WebSphere MQ`客户端必须与InterSystems IRIS安装在同一台计算机上。请注意,安装程序会根据需要更新`PATH`环境变量并添加其他系统变量。 - 确保在安装客户端后重新启动计算机,以便InterSystems IRIS能够识别该客户端。 - 客户端必须能够访问IBM `WebSphere MQ`服务器。 - 将用来访问服务器的用户名必须具有使用队列管理器和计划使用的队列的权限。 2. 创建`%Net.MQSend`或`%Net.MQRecv`的新实例,具体取决于要发送还是接收消息。 3. 连接到IBM `WebSphere MQ`服务器。执行此操作时,您需要提供以下信息: - 队列管理器的名称。 - 要使用的队列的名称。 - 与该队列通信的通道。可以指定IBM `WebSphere MQ`服务器的通道名称、传输机制以及IP地址和端口。 如果正在使用IBM `WebSphere MQ`的身份验证功能,还可以提供名称和密码。 4. 调用`%Net.MQSend`或`%Net.MQRecv`的相应方法来发送或接收消息。 注意:要在64位Linux平台上使用IBM `Websphere MQ`,必须设置`LD_LIBRARY_PATH`以包括`MQ`库的位置。因为必须为任何使用`MQ`接口的InterSystems IRIS进程设置路径,所以如果正在运行后台进程,则必须在启动InterSystems IRIS之前设置该路径,并在运行IRIS终端之前在任何UNIX®终端中设置该路径。 ## 获取错误代码 `%Net.MQSend`和`%Net.MQRecv`的方法如果成功则返回1,如果不成功则返回0。在出现错误的情况下,调用`%GetLastError()`方法,该方法返回IBM `WebSphere MQ`给出的最后一个原因代码。 # 创建连接对象 在可以通过IBM `WebSphere MQ`发送或接收消息之前,必须创建一个`Connection`对象,该对象可以建立到队列管理器的连接、打开通道和打开队列以供使用。有两种方法可以做到这一点: - 可以使用`%Init`方法,该方法接受指定所有所需信息的参数。 - 可以在首次设置指定所有所需信息的属性后使用`%Connect`方法。 ## 使用%Init()方法 要使用`%Init()`方法创建连接对象,请执行以下操作: 1. 创建`%Net.MQSend`(如果要发送消息)或`%Net.MQRecv`(如果要接收消息)的实例。本主题将此实例称为连接对象。 注意:如果收到 ``错误,则表示缺少动态链接库,并且`messages.log`文件(在系统管理器的目录中)有更多详细信息。 2. 如果需要身份验证,请设置`Connection`对象的以下属性: - 用户名-指定有权使用此频道的用户名。 - 密码-指定给定用户的密码。 3. 调用`Connection`对象的`%Init()`方法。此方法按顺序接受以下参数。 a. 指定队列名称的字符串;这应该是指定队列管理器的有效队列。 b. 指定队列管理器的字符串;它应该是IBM `WebSphere MQ`服务器上的有效队列管理器。 如果省略此参数,系统将使用IBM `WebSphere MQ`中配置的默认队列管理器。或者,如果IBM `WebSphere MQ`已配置为队列管理器由队列名称确定,则系统将使用适合给定队列名称的队列管理器。 c. 指定频道规范的字符串,格式如下: ```java "channel_name/transport/host_name(port)" ``` 这里,`channel_name`是要使用的通道的名称,`Transport`是通道使用的传输,`host_name`是运行IBM `WebSphere MQ`服务器的服务器名称(或IP地址),`port`是该通道应该使用的端口。 传输可以是以下之一:`TCP`、`LU62`、`NETBIOS`、`SPX` 例如: ```java "CHAN_1/TCP/rodan(1401)" ``` ```java "CHAN_1/TCP/127.0.0.1(1401)" ``` 如果省略此参数,系统将使用IBM `WebSphere MQ`中配置的默认通道规范。或者,如果系统已配置为通道由队列名称确定,则系统使用适合给定队列名称的通道。 d. 一个可选字符串,它指定要向其中写入错误消息的日志文件。默认情况下,不进行日志记录。 4. 检查`%Init()`方法返回的值。如果该方法返回1,则表明连接已成功建立,可以使用`Connection`对象发送或接收消息(具体取决于使用的类)。 ## 使用%Connect()方法 在某些情况下,可能更喜欢单独指定连接的所有详细信息。为此,请使用`%Connect()`方法,如下所示: 1. 创建`%Net.MQSend`(如果要发送消息)或`%Net.MQRecv`(如果要接收消息)的实例。如前所述,本主题将此实例称为连接对象。 注意:如果收到`` 错误,则表示缺少动态链接库,并且`messages.log`文件(在系统管理器的目录中)有更多详细信息。 2. 设置`Connection`对象的以下属性: - `QName`-(必选)指定队列名称;这应该是指定队列管理器的有效队列。 - `QMgr`-指定要使用的队列管理器;它应该是IBM `WebSphere MQ`服务器上的有效队列管理器。 如果省略此参数,系统将使用IBM `WebSphere MQ`中配置的默认队列管理器。或者,如果IBM `WebSphere MQ`已配置为队列管理器由队列名称确定,则系统将使用适合给定队列名称的队列管理器。 3. 或者,通过设置`Connection`对象的以下属性来指定要使用的频道: - `Connection` - 指定IBM `WebSphere MQ`服务器的主机和端口。例如:`"127.0.0.1:1401"`。 - `Channel` - 指定要使用的频道的名称。这必须是IBM WebSphere MQ服务器上的有效通道。 - `Transport` - 指定通道使用的传输。此属性可以是以下之一: `"TCP"`, `"LU62"`, `"NETBIOS"`, `"SPX"` 如果省略这些参数,系统将使用IBM `WebSphere MQ`中配置的默认通道规范。或者,如果系统已配置为通道由队列名称确定,则系统使用适合给定队列名称的通道。 4. 如果频道需要身份验证,请设置`Connection`对象的以下属性: - 用户名-指定有权使用此频道的用户名。 - 密码-指定给定用户的密码。 5. 调用`Connection`对象的`%ErrLog()`方法。此方法接受一个参数,即要用于此连接对象的日志文件的名称。 6. 检查`%ErrLog()`方法返回的值。 7. 调用`Connection`对象的`%Connect()`方法。 8. 检查`%Connect()`方法返回的值。如果该方法返回1,则表明连接已成功建立,可以使用`Connection`对象发送或接收消息(具体取决于您使用的类)。 # 指定字符集(CCSID) 要设置用于消息转换的字符集,请调用`Connection`对象的`%SetCharSet()`方法。指定在IBM `WebSphere MQ`中使用的整数编码字符集`ID(CCSID)`。 - 如果正在发送消息,这应该是这些消息的字符集。如果不指定字符集,则MQ系统假定消息使用为`MQ`客户端指定的默认字符集。 - 如果要检索邮件,则这是要将这些邮件翻译为的字符集。 要获取当前正在使用的`CCSID`,请调用`%charset()`方法。此方法通过引用返回`CCSID`,并返回1或0以指示是否成功. # 指定其他消息选项 要指定消息描述符选项,可以选择设置连接对象的以下属性: - `ApplIdentityData`指定应用程序标识消息描述符选项。 - `PutApplType`指定`PUT Application Type`消息描述符选项。 ## 发送消息 要发送邮件,请执行以下操作: 1. 按照“创建连接对象”中的说明创建连接对象。在这种情况下,请创建`%Net.MQSend`的实例。`Connection`对象有一个消息队列,可以向该队列发送消息。 2. 根据需要调用以下方法: - `%put()`-给定一个字符串,此方法将该字符串写入消息队列。 - `%PutStream()`-给定初始化的文件字符流,此方法将该字符串写入消息队列。请注意,必须设置流的`Filename`属性才能对其进行初始化。不支持二进制流。 - `%SetMsgId()`-给定一个字符串,此方法使用该字符串作为发送的下一条消息的消息ID。 3. 检查调用的方法返回的值。 4. 检索完消息后,调用`Connection`对象的`%Close()`方法以释放动态链接库的句柄。 示例1:`SendString()` 下面的类方法使用队列管理器`QM_antigua`和名为 `S_antigua`的队列通道向队列`mqtest`发送一条简单的字符串消息。通道使用TCP传输,IBM `WebSphere MQ`服务器运行在名为`Antigua`的机器上,并侦听端口1401。 ```java ///Method returns reason code from IBM WebSphere MQ ClassMethod SendString() As %Integer { Set send=##class(%Net.MQSend).%New() Set queue="mqtest" Set qm="QM_antigua" Set chan="S_antigua/TCP/antigua(1414)" Set logfile="c:\mq-send-log.txt" Set check=send.%Init(queue,qm,chan,logfile) If 'check Quit send.%GetLastError() //send a unique message Set check=send.%Put("This is a test message "_$h) If 'check Quit send.%GetLastError() Quit check } ``` 示例2:`SendCharacterStream()` 下面的类方法发送文件字符流的内容。它使用的队列与上一个示例中使用的队列相同: ```java ///Method returns reason code from IBM WebSphere MQ ClassMethod SendCharacterStream() As %Integer { Set send=##class(%Net.MQSend).%New() Set queue="mqtest" Set qm="QM_antigua" Set chan="S_antigua/TCP/antigua(1414)" Set logfile="c:\mq-send-log.txt" Set check=send.%Init(queue,qm,chan,logfile) If 'check Quit send.%GetLastError() //initialize the stream and tell it what file to use Set longmsg=##class(%FileCharacterStream).%New() Set longmsg.Filename="c:\input-sample.txt" Set check=send.%PutStream(longmsg) If 'check Quit send.%GetLastError() Quit check } ``` 示例3:从终端发送消息 以下示例显示了向IBM `WebSphere MQ`队列发送消息的终端会话。这只能在配置了IBM `WebSphere MQ`客户端的计算机上运行。 ```java Set MySendQ = ##class(%Net.MQSend).%New() Do MySendQ.%Init("Q_1", "QM_1","QC_1/TCP/127.0.0.1(1401)","C:\mq.log") Do MySendQ.%Put("Hello from tester") Set MyRecvQ =##class(%Net.MQRecv).%New() Do MyRecvQ.%Init("Q_1", "QM_1","QC_1","C:\mq.log") Do MyRecvQ.%Get(.msg, 10000) Write msg,! ```
文章
姚 鑫 · 五月 14, 2021

第六章 临时全局变量和IRISTEMP数据库

# 第六章 临时全局变量和IRISTEMP数据库 对于某些操作,可能需要全局变量的功能,而不需要无限期保存数据。例如,可能希望使用全局对某些不需要存储到磁盘的数据进行排序。对于这些操作,`InterSystems IRIS`提供了临时全局机制。该机制的工作方式如下: - 对于应用程序名称空间,可以定义一个全局映射,以便将具有特定命名约定的全局变量映射到`IRISTEMP`数据库,该数据库是一个特殊的数据库,如下所述。 例如,可以定义一个全局映射,以便将名称为`^AcmeTemp*`的所有全局变量映射到`IRISTEMP`数据库。 - 当代码需要临时存储数据并再次读取它时,代码将向使用该命名约定的全局变量写入数据,并从全局变量读取数据。 例如,要保存值,代码可能会执行以下操作: ```java set ^AcmeTempOrderApp("sortedarray")=some value ``` 然后,稍后代码可能会执行以下操作: ```java set somevariable = ^AcmeTempOrderApp("sortedarray") ``` **通过使用临时全局变量,可以利用`IRISTEMP`数据库没有日志记录这一事实。因为数据库没有日记记录,所以使用该数据库的操作不会产生日记文件。日志文件可能会变得很大,并可能导致空间问题**。但是,请注意以下几点: 不能回滚修改`IRISTEMP`数据库中的全局变量的任何事务;此行为特定于`IRISTEMP`。如果需要通过事务管理临时工作,请不要使用`IRISTEMP`中的全局变量来实现此目的。 请注意,仅对不需要保存的工作使用`IRISTEMP`。 # 定义临时全局变量的映射 要定义临时全局变量的映射,请执行以下操作: 1. 选择一个命名约定,并确保所有开发人员都知道这一点。请注意以下几点: - **考虑是要有多个临时全局变量还是要少一些具有多个节点的临时全局变量。与读取或写入相同数量的独立全局变量相比,`InterSystems IRIS`更容易高效地读取或写入同一全局变量中的不同节点。这种效率差异对于少数全局变量来说可以忽略不计,但当有数百个独立的全局变量时,效率差异就非常明显。** - 如果计划在多个名称空间中使用相同的全局映射,那么设计一个系统,使一个名称空间中的工作不会干扰另一个名称空间中的工作。例如,可以使用命名空间名称作为全局变量中的下标。 - 类似地,即使在一个命名空间内,也要设计一个系统,使代码的每个部分在同一全局中使用不同的全局或不同的下标,以避免干扰。 - 请勿使用系统保留的全局名称。 2. 在管理门户中,导航到命名空间页面(System Administration > Configuration > System Configuration > Namespaces)。 3. 在应用程序命名空间所在的行中,单击Global Mappings。 4. 在全局映射页面中,单击新建全局映射。 5. 对于全局数据库位置,选择`IRISTEMP`。 6. 对于全局名称,输入以星号(`*`)结尾的名称。不要包括名称的第一个插入符号。 例如: `AcmeTemp*` 此映射会导致名称以`AcmeTemp*`开头的所有全局变量映射到`IRISTEMP`数据库。 7. 单击OK。 注意:>> 显示在新映射行的第一列中,表示已打开映射进行编辑。 8. 要保存映射以便InterSystems IRIS使用它们,请单击保存更改。 ![image](/sites/default/files/inline/images/1_45.png) ![image](/sites/default/files/inline/images/2_26.png) ![image](/sites/default/files/inline/images/3_21.png) ![image](/sites/default/files/inline/images/4_15.png) # IRISTEMP的系统使用 请注意,InterSystems使用临时全局变量作为临时空间,例如,在执行某些查询(用于排序、分组、计算聚合等)期间用作临时索引。 IRISTEMP中包含的一些系统全局变量包括: - `^IRIS.Temp*` - `^mtemp*` 永远不要更改这些全局变量中的任何一个。
文章
Hao Ma · 一月 10, 2021

Windows 写入缓存

本文讨论 Windows 写入缓存设置,该设置会使系统在断电或操作系统崩溃的情况下容易发生数据丢失或损坏。 该设置在某些 Windows 配置中默认开启。 为磁盘启用 Windows 写入缓存意味着 Caché(或任何程序)写入该磁盘的某些内容不一定会立即提交到持久性存储(即使 Caché 在其写入阶段的特定关键点刷新从操作系统缓存到磁盘的写入也是如此)。 如果计算机断电,为该设备缓存的任何内容都会丢失,除非该设备的缓存是非易失性的或者由电池供电。 Caché 依靠操作系统来保证数据的持久性。 在这种情况下,保证是无效的。 对于 Caché 来说,这可能会导致数据库损坏或者数据库或日志文件中的数据缺失。 InterSystems 的文档显示,使“写入映像日志”提供的保证失效的一种情况是回写缓存内容丢失(请参见 [http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_wij#GCDI/wij_limits](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_wij#GCDI_wij_limits))。 InterSystems 全球响应中心的数据完整性团队研究了许多 Windows 平台上的数据丢失或损坏案例,这些案例中有证据表明,回写缓存内容丢失是由该设置的值导致的。 值得一提的是,磁盘的缓存可能会有效防止发生此类问题。 如果相关磁盘的缓存是非易失性的或由电池供电,则即使开启该设置,写入磁盘也应该是安全的。 如果相关存储比直接连接的磁盘更复杂,您需要了解在该存储基础架构的何处对写入进行缓存,以及这些缓存是否是易失性的或者是否由电池供电,以评估风险。 您可以转到“设备管理器”,展开“磁盘驱动器”部分,然后查看给定磁盘的属性来查看设置。 我们感兴趣的设置在“策略”选项卡上。 ![](/sites/default/files/inline/images/p1_0.png) 界面上的用词并不总是与您在这里看到的相同,可能因设备类型的不同而有所不同。 不过,这是常见的用词表述,并且 Windows 明确指出,开启该设置后,如果机器断电或崩溃,系统可能会发生数据丢失。 接下来是同一机器上另一个磁盘的示例,其中的影响没有那么明显。在这里选择“更好的性能”将与在另一个示例中选择“启用写入缓存”带来相同问题。 ![](/sites/default/files/inline/images/p2.png) 在这两个示例中,您看到的选定设置都是该设备的默认设置,我没有更改过。 您可以看到,在第一个示例中,默认设置使设备处于风险之中,而第二个示例则没有。 据我所知,并没有通用于所有设备类型或 Windows 版本的默认设置。 换句话说,需要在每台设备上检查此设置,以了解设备是否存在此风险。 作为系统管理员,处理这种情况有三种基本方法。 禁用该设置是最简单的方法,可确保不会面临此风险。 但是,禁用该设置可能会对性能产生不可接受的影响。 如果是这种情况,您可能更愿意开启该设置,并将计算机连接到不间断电源。 这样做可以防止断电导致的数据丢失或损坏,因为 UPS 应该可以在断电时提供足够的时间让您从容地关机。 最后一个选择是简单地接受服务器断电或崩溃时数据丢失的风险。 InterSystems 建议不要采用此方式。 消费级 UPS 已相当便宜,而且检测完整性问题并从中恢复可能非常耗时又会产生问题。 InterSystems 建议您在未确保计算机连接到不间断电源的情况下不要开启此设置。 如果存储是外部设备,则该设备也需要连接到 UPS。
文章
Frank Ma · 七月 28, 2022

华山论剑-应用集成平台

应用集成平台市场上产品众多,商家专家观点纷纭,莫衷一是。Gartner公司从用户角度出发,搭建了Peer Insight “大众点评”平台,让用户能够为自己使用的产品发声,对各个产品打分。以下是来自用户的声音,供参考。 第一款产品是微软的BizTalk,综合得分3.9。 第二款产品是InterSystems的Ensemble,综合得分4.6。 第三款产品是IBM的WebSphere Enterprise Service Bus,综合得分3.8。 BizTalk by MicroSoft Ensemble by InterSystems WebSphereEnterprise Services Busby IBM 总体评价:57%的用户愿意推荐该产品 总体评价:88%的用户愿意推荐该产品 总体评价:55%的用户愿意推荐该产品 分项评分 分项评分 分项评分 综合能力得分 综合能力得分 综合能力得分 评估与签约 3.3 定价灵活性 4.0 理解需求的能力 评估与签约 4.2 定价灵活性 4.6 理解需求的能力 评估与签约 3.5 定价灵活性 4.0 理解需求的能力 集成与部署 3.4 部署便利性 3.3 终端用户培训的质量 3.9 使用标准API和工具进行集成的便利性 3.1 第三方资源的可用性 集成与部署 4.3 部署便利性 4.3 终端用户培训的质量 4.3 使用标准API和工具进行集成的便利性 4.3 第三方资源的可用性 集成与部署 4.6 部署便利性 4.2 终端用户培训的质量 4.0 使用标准API和工具进行集成的便利性 4.1 第三方资源的可用性 服务与支持 4.0 供应商回应的及时性 3.7技术支持的质量 3.4 同行用户群的质量 服务与支持 4.6 供应商回应的及时性 4.6技术支持的质量 4.2 同行用户群的质量 服务与支持 4.0 供应商回应的及时性 4.3技术支持的质量 4.1 同行用户群的质量 更多信息请参考 Gartner英文原文。
文章
Michael Lei · 八月 8, 2022

FHIR 实操--借助VS Code 中的IntelliSense和自动完成功能,通过使用FHIR Schema创建和验证任何HL7 FHIR资源

医疗行业的互操作性在改善病人护理、降低医疗服务提供者的成本以及为提供者提供更准确的情况方面发挥着重要作用。然而,由于有这么多不同的系统,数据的格式也有很多不同的方式。有许多标准被创造出来以试图解决这个问题,包括HL7v2、HL7v3和CDA,但每一种都有其缺点。 FHIR,即快速医疗互操作性资源,是一种新的医疗数据格式,旨在解决这些问题。它是由国际卫生级七组织(HL7)开发的,该组织还开发了HL7v2、HL7v3和CDA。 今天我们将探讨如何在VS代码中借助IntelliSense和自动完成功能,通过使用FHIR Schema 创建和验证FHIR资源。 第 1 步 :从FHIR 官方网站 https://www.hl7.org/fhir/下载 JSON schema file 文件用来做资源校验 第 2 步: 创建文件夹(在这个例子中,我使用病人文件夹和病人资源),并将提取的fhir.schema.json文件复制到同一文件夹,然后从VS Code中打开文件夹 第 3 步: 通过修改setting.json文件,设置VS代码以识别FHIR模式。按CTRL+SHIFT+P并输入工作区设置JSON文件 第 4 步: 在同一文件夹中创建一个新文件patient.fhir.json。按Ctrl+Space,你将通过IntelliSense获得FHIR资源的所有属性 添加资源类型 "病人",与病人资源有关的所有属性将出现在IntelliSense中。 VS Code 讲自动校验资源的结构和语法。 在IntelliSense和自动完成的帮助下,我们已经创建并验证了我们的病人资源。 第 5 步: 使用Postman的Rest API在InterSystems FHIR服务器上发布创建资源。 通过使用获取方法检索已创建的病人资源。 恭喜你!,我们已经创建、验证了我们的病人资源,并成功地使用postman发布和检索到InterSystems FHIR服务器。通过这种方式,我们可以轻松地创建和验证任何FHIR资源。
文章
Johnny Wang · 一月 30, 2022

统一技术的高效数据架构能帮助客户节约大量成本

我的几个孩子都很喜欢手工艺品,您可能会觉得作为一个父亲我会用夸张的表情表扬他们很有创意然后还拍照片发到Pinterest(世界上最大的图片社交分享网站)上去,但是我从来都没这么做过。我肯定爱我的孩子,我也确实认为他们有创意,但老实讲如果你有一个正上小学的孩子,你肯定很清楚他们实际的水平。 首先,要去制作一个手工艺品,你得先在油管上面看五分钟的教学视频,在此之前你可能已经浏览过大量的同类视频,你也知道那些标题党起的“五分钟教你学会”的题目就是在骗你点进去,但你可能刷着刷着手机就过去了五个钟。这类视频无非是一个人拿着一个彩色的塑料瓶,或者一个有光泽的鞋盒,把所有东西切开、用胶带和胶水粘在一起,然后你就获得了一个精美无比但是根本没用的艺术品,但至少拍照片发个朋友圈看起来还蛮不错。 第二步,你小孩看完视频了,也想自己动手做。老实讲你没法拒绝这种能够锻炼他们创意的好机会,这绝对是寓教于乐的好机会,你也把那些瓶子、纸板箱和其他的垃圾重新利用起来了。这些视频往往十分重要,这说不定会影响他们以后成为成功的设计师、建筑师或者行业精英。 再然后,关键的东西来了:胶水。 我家的手工艺品购买预算(您别说真有这么个预算)几乎都花在了买胶水或者胶带上,在过去几年中,我都在用一种叫做“和纸”的带光泽的胶带、用来打胶的胶枪和会发光的百特棒,它贴在厨房或者餐桌等等地方就会很亮。还好我现在的工作让我承担得起这些花费,但同样让人沮丧的是大部分钱都被花在胶带胶水这种辅助工具上,而不是花在提升手工艺品的质量上。 系统之间的数据流成本很高 当我看到企业架构师描述他们的环境时,我经常有一种感觉,同时这种感觉也经常让我觉得挫败。那些架构师将经过验证的开源技术(比如 Postgres 和 MySQL 或他们的云版),与一种或多种花哨的专用技术(如 Clickhouse、TimescaleDB 或 CouchBase)结合到一个数据架构中。从表面上看,这完全有道理。 我们非常感谢那些经过验证的开源技术,作为一名技术专家,我经常对这些用于特殊用途的解决方案所产生的创新印象深刻。 然而,这种方法产生的复合数据架构通常不像预期的那么简单或预算友好,这与我的孩子经常要求增加手工艺品预算的原因相同:胶水不够用了。 一个好的数据管道或 ETL 软件并不便宜,构建这些数据流的数据工程师或顾问也不便宜。 更糟糕的是,就像我孩子的胶带会磨损一样,系统之间的数据流需要昂贵的维护,因为它们需要保持运行的时间也很长,这绝不是一个5分钟的手工艺品视频讲得清楚的事情。 采用统一技术的高效数据架构 像 InterSystems IRIS 这样的统一数据平台提供了事务处理和分析工作负载的数据架构,并通过许多不同的数据模型提供高效的并发访问,所有这些都采用统一技术。 通过在 InterSystems IRIS 上构建你的应用程序、数据仓库和其他解决方案,你可以节省大量粘合和手动工作,而不会牺牲处理您的用例所要求的特殊用途数据,因为没有复制、同步或推送你的数据。 更重要的是,使用这种类型的数据架构,您最终将获得在医疗保健、金融服务和许多其他行业中已经得到证明的弹性,而不是五种不同工具的最小公分母。 回到手工艺品的话题上,我希望未来每隔一周左右我问我的孩子们的问题能够变成这样:“我不是不要你的创意; 我只是要求你少用胶水。” 关于作者:Benjamin DeBoe Benjamin 是 InterSystems 数据平台组的产品经理,负责可扩展性和分析领域。 作为 InterSystems 收购 iKnow 的一份子,他于 2010 年加入 InterSystems,并曾使用各种数据库技术,主要在数据仓库、自然语言处理和任何分析领域。 点击查看原文链接 乐高就是不用胶水的创造,中国传统的木结构(榫卯)也是不需要胶水的,最好/稳固的创造/搭建都是不用胶水的。。。 这个类比非常到位了
问题
Johnny Wang · 二月 24, 2022

问题转发

请教各位老师: Cache数据日志怎么读取? 如果是想写代码去读取,应该怎么操作?如果是不知道数据日志在哪,应该在哪可以获取? 不知道你问题里的日志是不是指的journal文件。 没有直接读取journal的方法,只有类似MirrorDejournal的方法对写入异步镜像成员的journal进行操作, 比如将内容写入到你自己的一个数据global中。 在写journal的同时将journal中记录的内容存放在另一个地方。 具体做法可以参考社区里的另一篇文章:CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能 对于较早版本还没有镜像Mirror的配置,则可以使用Shadow服务器的Dejournaling filter routine。 可以参考:CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC
文章
Michael Lei · 六月 1, 2022

部分IRIS 2022 年度编程大奖赛作品展示——FHIR 病人查看器

![Alt Text](https://media.giphy.com/media/UXO1VWyK7ZeD72NwVg/giphy.gif) 大家好! 在这里跟大家分享一下我在大奖赛上的项目 :) FHIR病人查看器是一个建立在Vue.js上的单页、反应式渲染工具,它以对人友好的方式显示从对InterSystems FHIR服务器的/Patient/{id}/$everything调用返回的数据。在自述文件中,包括3个主要内容: 1. 一个视频演示,将FHIR患者浏览器连接到一个沙盒IRIS FHIR服务器上(这是测试它的最快方法); 2.第二个视频显示我如何在生产环境中使用FHIR患者浏览器(使用一个定制的后端来处理API调用,在我的例子中用PHP/Laravel编写,但可以转移到其他语言/框架); 3.修改组件的说明,创建你自己版本的工具,并建立你自己的dist文件。 谢谢大家! 本次大赛的参赛作品质量很好! Dan
文章
Michael Lei · 十一月 9, 2021

翻译文章--通过ODBC用Appeon PowerBuilder连接IRIS

https://www.appeon.com/products/powerbuilder Appeon PowerBuilder 是一个企业级开发工具,可以用来建立数据驱动的商业应用程序和组件。它是Appeon产品套件之一,同时提供了开发C/S、Web、移动和分布式应用程序的工具。 在这篇文章中,我将展示通过使用ODBC用Appeon PowerBuilder连接Caché的步骤。 步骤1 :确保在安装IRIS时选择ODBC驱动程序选项。 步骤2:通过使用ODBC数据源管理器配置ODBC IRIS数据源 步骤 3: 配置InterSystems ODBC 数据源 步骤 4: 测试连接 (确保 IRIS 实例在运行) 步骤 5: 从 PowerBuilder 打开数据库Profiles, 在列表选中ODB ODBC并单击“新建 New”... 按钮 步骤 6: 选择我们已经用ODBC管理器创建的 "IRISHealth User"数据源 步骤 7: 点击“测试连接Test Connection” 按钮,在Preview页面下测试连接 恭喜! 我们已经成功建立了IRIS链接。现在我们可以用PowerBuilder database painter来看表和数据了 谢谢
文章
Claire Zheng · 二月 1, 2021

如何发帖以及其他常见问题解答

Hi, 大家好! 我们正在努力改进本网站,让大家可以在 InterSystems 开发者社区舒适地阅读、贡献、分享和获取答案! 虽然有一些 UI 问题还没有得到修复,但本帖提供了一些关于如何使用开发者社区的简单回答。 如何添加帖子? 打开社区页面, 选择所需产品,例如 Caché 然后点击 "创建新帖"。 如何订阅帖子的更新? 要订阅帖子的更新并通过电子邮件获取它们,请点击帖子摘要下方的“收藏”,例如: 如何管理帖子的标题? 假设您已经创建文章,并且想要在其注释中添加几句话。 为此,将编辑器切换到“筛选的 HTML”模式,然后在注释末尾输入<!--break--> 标签。 否则注释会被修剪为一两句话。 就像这样: 未完待续。 敬请期待!
问题
Luo Haimianbaobao · 四月 13, 2023

Production中的java网关服务EnsLib.JavaGateway.Service会经常连接超时,导致适配器EnsLib.SQL.InboundAdapter使用jdbc连接数据库的BS报错

问题如标题。尝试过改变java网关端口,还是会经常出现报错,错误如下图: 这个java Gateway 报错的引起的原因可能很多,如果是生产环境,建议开一个WRC工单,如果是开发测试环境可以InterSystems 的se 可以将Java Gateway Service的日志打开,设置方法是在Production管理页面选中该组件上,在设置中设置日志文件(包括路径和文件名称)。如果问题再次出现,我们可以对日志文件进行分析,开启之后请注意该文件的大小增长。 另外,linux的Dynamic TCP port范围是32768~60999,可通过下面的命令进行查询,例如(在RedHat7.9下), sysctl net.ipv4.ip_local_port_range net.ipv4.ip_local_port_range = 32768 60999 在这个范围内的tcp端口号可能会被系统动态分配给其他进程使用,所以建议咱们更改一个不在此范围内的端口号。
文章
Frank Ma · 五月 24, 2022

我们如何将报告生成时间减少28倍

同事们,大家好 在这篇文章中,我将告诉你我们如何将报告生成时间从28分钟减少到1分钟。让我告诉你我们是如何实现这一目标的 我希望,如果有必要,你将能够为自己重现同样的结果。这篇文章里有一些有用的链接,所以要读到最后。 让我们开始吧。 报告 我们使用Adaptive Analytics和InterSystems Reports Server为一家公司做报告。以前,这个报告是以DeepSee的屏幕截图形式生成的。总的来说,这并不坏,但它花费了大量的时间,而且看起来不是很可读。该报告本身由12页组成,为PDF格式。 一般来说,数据不是太大,不会使报告的生成花费很多时间 源数据 然而,在撰写本文时,有一个表包含11,330,263行。不是那么关键,但它造成了延迟。即使是计算行数的查询也需要近30秒 最初,系统的交互方案是这样的: Atscale创建了自己的数据缓存,这导致了性能的提高。 Logi使用自己的数据缓存,这稍微加快了报告的开发速度。 但总的来说,这仍然导致了报告在28分钟内形成的事实。 鉴于报告只有12页,这个速度还是很慢的。 我们甚至故意添加了新的标签,并将报告中的小部件复制到那里,以便在开发或调试时不需要生成整个报告。也许这就是在Logi上开发时的一种日常技巧,或者说是一种正常的开发方法。总的来说,我们在工作中使用了它 在报告生成时,有数百个请求从Logi到Atscale,还有一些请求从Astcale到IRIS。一些单独的查询长达4分钟。有几次,请求一般都是在超时的情况下发出的。 然后我们意识到,这种情况不能再继续下去了。于是我们把自适应分析的主要功能连接起来,方案变成了这样: 这是一个UDAF功能,换句话说,这是个用户定义的聚合函数。实际上这是些汇总表,根据要求,定期地将需要测量的聚合值存储在其中。而最有趣的是,这些汇总表是由Atscale自动创建和更新的。 为了实现聚合,我们编译了isc-aa-udaf包,该包目前在一个私人仓库中,因为根据Atscale的使用条款,它不能被免费分发。 在打开汇总表后,创建服务表花了几分钟,汇总表被计算,总的来说,数据库被加载。但随后真正的解脱开始了。系统开始像它应该的那样工作。以前需要4分钟才能形成的请求,开始在5秒内形成。缓存变得更快。 结果,原先花了28分钟才形成的报告现在开始在1分钟内形成。 值得注意的是,这样的增长更多的是稳定的、生产系统的特征,在这些系统中,立方体是相对稳定的,聚集物被越来越多的收集。当立方体结构发生变化时,在对变化后的立方体的第一次请求中,聚合被重构并重新创建。 我们做了什么 我们所做的基本如下: 安装IRIS Adaptive Analytics UDAF 在IRIS中创建名称空间,用于存储聚合数据 连接IRIS 到 Atscale 定制功能安装模式=在数据仓库中启用定制管理功能 Adaptive Analytics已经用数据创建了一个立方体 在Logi中创建报告 测试和测量 这里的细节: InterSystems IRIS已经为UDAF的工作安装了必要的类。我们已经将它们打包在一个名为isc-aa-udaf的ZPM包中,该包存储在zpm注册表pm.intersystems.com中。这个注册表对InterSystems的官方客户是可用的。 iris 命令: zpm “install isc-aa-udaf” 一个旨在优化资源使用的可选项:我们为IRIS添加了一个专门的命名空间,它将存储预先计算的聚合值。这个命名空间的名称将在下一步中用到。 将IRIS连接到Atscale作为立方体(Cube)的数据源。转到设置(Setting),然后是数据仓库(Data Warehouses ),最后是创建数据仓库(CREATE DATA WAREHOUSE)。 在字段号1中指定了解析后的数据所存储的命名空间 在字段号2中,我们指定了在步骤2中创建的用于存储聚合的命名空间。这个值可以与1的值相同,在这种情况下,集合体将被存储在数据的旁边。在这种情况下,数据源不能是只读的。 我们将定制功能安装模式(CUSTOM FUNCTION INSTALLATION MODE)设置为用户管理(Customer Managed),因为我们之前在第一步安装了UDAF。如果你指定无(None)模式,那么即使安装了UDAF,这些功能也不会被使用,也不会有性能上的提高。 如果一切操作正确,那么UDAF检查显示绿色。 使用创建的数据仓库创建了一个项目和一个立方体。这是一个漫长而令人兴奋的过程。我不会在这里详细谈论这个问题,已经有好几篇关于它的文章,包括我的文章《如何轻松开始在Adaptive Analytics + InterSystems Reports中工作》。 Atscale上发布的项目为Logi报告创建了数据源连接。在之前的文章中,我也介绍了如何创建报告。链接为: 《如何轻松开始在Adaptive Analytics + InterSystems Reports中工作》。 测试和测量。这里很有趣。我最初设计的报告没有启用UDAF。正因为如此,一些请求被执行了4分钟或更长时间。由于该报告由12页组成,完成报告的时间平均为28分钟。 启用UDAF后,Atscale系统在自动模式下用一段时间加载数据源。她会自己计算将在报告中使用的实际查询,并为它准备预先计算的数值。此外,Intersystems报告是基于计算出来的参数,Intersystems报告本身对这些参数进行了部分缓存,AtScale系统给出了额外的优化,它缓存了执行相同查询的结果并即时返回,而不是重新发送到数据源。 在所述的捆绑工作包中,还有一个有趣的点:报告生成的频率越高,制作报告的时间就越短。 根据所有操作和几次测量的结果,生成12页报告的时间开始是60秒,也就是1分钟。 差别是28倍。 同时,类似的报告,在结构上完全相同,但从其他数据库中获取数据,其构建速度也有类似的提高。 基于我们所看到的,我们做出了一个明确的结论,推荐在所有未来的项目中使用这个捆绑包。它可以提高开发速度,提升调试速度,并减少向这些报告的商业消费者交付报告的时间。 我希望将来我们能够从IRIS - AtScale - Logi捆绑系统中提取更多的性能,并能够与你分享我们发现的解决方案。 如果你也有这类提升工具链性能的经验和我们分享,我将非常感激。
文章
姚 鑫 · 二月 3, 2022

第四十三章 SQL函数 DATEDIFF

[toc] # 第四十三章 SQL函数 DATEDIFF 日期/时间函数,返回两个日期之间指定日期部分的整数差。 # 大纲 ``` DATEDIFF(datepart,startdate,enddate) ``` # 参数 - `datepart` - 日期或时间部分的名称(或缩写)。这个名称可以用大写或小写来指定,有或没有引号。`datepart`可以指定为文字或主机变量。 - `startdate` - 间隔的开始日期/时间。可以是各种标准格式的日期、时间或日期时间。 - `enddate` - 间隔的结束日期/时间。可以是各种标准格式的日期、时间或日期时间。从`enddate`中减去`startdate`,以确定两个日期之间的日期部分间隔。 # 描述 `DATEDIFF`函数返回两个指定日期之间指定日期部分差的整数。日期范围从开始日期开始,到结束日期结束。(如果`enddate`早于`startdate`,`DATEDIFF`将返回一个负整数值。) `DATEDIFF`返回`startdate`和`enddate`之间指定单位的总数。例如,两个日期时间值之间的分钟数计算日期部分和时间部分,并为每一天的差异增加`1440`分钟。`DATEDIFF`返回开始日期和结束日期之间跨越的指定日期部分边界的计数。例如,指定连续年份的任意两个日期(例如`2018-09-23`和`2019-01-01`)返回的年份`DATEDIFF`为1,而不管这两个日期之间的实际持续时间是大于还是小于`365`天。同样,`12:23:59`和`12:24:05`之间的分钟数是1,尽管实际上只有`6`秒将两个值分开。 请注意,`DATEDIFF`是为Sybase和Microsoft SQL Server兼容性而提供的。使用`TIMESTAMPDIFF ODBC`标量函数可以执行类似的时间/日期比较操作。 也可以使用`DATEDIFF()`方法调用从`ObjectScript`调用此函数: ```sql $SYSTEM.SQL.Functions.DATEDIFF(datepart,startdate,enddate) ``` 为`DATEDIFF()`方法指定无效的`datepart`、`startdate`或`enddate`会生成`< ZDDIF >`错误。 # Datepart 参数 日期部分参数可以是下列日期/时间组件之一,可以是全名(日期部分列)或其缩写(缩写列)。这些`datepart`组件名称和缩写不区分大小写。 Date Part| Abbreviations ---|--- year| yyyy, yy month |mm, m week| wk, ww weekday |dw day |dd, d dayofyear| dy hour |hh minute| mi, n second| ss, s millisecond| ms microsecond| mcs nanosecond| ns `weekday`和`dayofyear datepart`值在功能上与`day datepart`值相同。 `DATEDIFF`和`TIMESTAMPDIFF`不处理季度(间隔`3`个月)。 如果指定包含分数秒的开始日期和结束日期,`DATEDIFF`将以分数秒的整数形式返回差值,如下例所示: ```sql SELECT DATEDIFF('ms','64701,56670.10','64701,56670.27'), /* returns 170 */ DATEDIFF('ms','64701,56670.1111','64701,56670.27222') /* returns 161 */ ``` `datepart`可以指定为带引号的字符串或不带引号的字符串。这些语法变体执行略有不同的操作: - Quotes: `DATEDIFF('month','2018-02-25',$HOROLOG)`:在创建缓存查询时,`datepart`被视为文字。SQL执行文字替换。这将产生一个更容易重用的缓存查询。 - 无引号: `DATEDIFF(month,'2018-02-25',$HOROLOG)`:创建缓存查询时,`datepart`被视为关键字。没有文字替换。这将生成更具体的缓存查询。 # 日期表达式格式 `startdate`和`enddate`参数可以采用不同的数据类型格式。 `startdate`和`enddate`参数可以采用以下任何格式: - `%Date`逻辑值(`+$H`),也称为`$HOROLOG`格式。 - `%PosixTime`(`%Library.PosixTime`。逻辑值(编码的64位有符号整数) - `%TimeStamp`(`%Library.TimeStamp`)逻辑值(`YYYY-MM-DD HH:MM:SS。FFF`),也称为`ODBC`格式。 - `%String`(或兼容)值。 `%String`(或`compatible`)值可以是以下任何一种格式,可以包含或省略小数秒: - `99999、99999` (`$HOROLOG`格式)。 `$HOROLOG`特殊变量不返回小数秒。 但是,可以使用`$HOROLOG`格式指定一个包含分数秒的值:`99999,99999.999` - Sybase/SQL-Server-date Sybase/SQL-Server-time - Sybase/SQL-Server-time Sybase/SQL-Server-date - Sybase/SQL-Server-date (default time is 00:00:00) - Sybase/SQL-Server-time (default date is 01/01/1900) Sybase/SQL-Server-date是以下五种格式之一: ```sql mm/dd/[yy]yy dd Mmm[mm][,][yy]yy dd [yy]yy Mmm[mm] yyyy Mmm[mm] dd yyyy [dd] Mmm[mm] ``` 在第一种语法格式中,分隔符可以是斜杠(`/`)、连字符(`-`)或句点(`.`)。 Sybase/SQL-Server-time表示以下三种格式之一: ```sql HH:MM[:SS[:FFF]][{AM|PM}] HH:MM[:SS[.FFF]] HH['']{AM|PM} ``` ## Years 如果年份以两位数字表示,或者日期被完全省略, IRIS会检查滑动窗口来解释日期。 系统范围内滑动窗口的默认值是`1900`; 因此,在默认情况下,两位数的年份被认为是在20世纪。 如下示例所示: ```sql SELECT DATEDIFF('year','10/11/14','02/22/2018'), DATEDIFF('year','12:00:00','2018-02-22 12:00:00') ``` ## 分数秒 `DATEDIFF`返回以毫秒(3位整数)、微秒(6位整数)或纳秒(9位整数)表示的小数秒,而不管`startdate`和`enddate`中的小数位数精度是多少。 如下示例所示: ```sql SELECT DATEDIFF('ms','12:00:00.1','12:00:00.2'), DATEDIFF('ms','12:00:00.10009','12:00:00.20007') ``` 一些NLS区域设置将分数分隔符指定为逗号(欧洲的用法),而不是句号。 如果当前区域设置是这些区域设置之一,`DATEDIFF`接受句号或逗号作为本地日期格式的秒分隔符。 对于`$HOROLOG`格式的日期或`ODBC`格式的日期,不能使用逗号作为小数秒分隔符。 尝试这样做会生成一个`SQLCODE -8`。 无论当前的NLS语言环境是什么,这两种格式都需要一段时间。 # 时间差异与时间格式无关 `DATEDIFF`返回以秒和毫秒为单位的时间差,即使当前进程的`TimeFormat`被设置为不返回秒。 如下示例所示: ```java ClassMethod DateDiff() { s tfmt = ##class(%SYS.NLS.Format).GetFormatItem("TimeFormat") d ##class(%SYS.NLS.Format).SetFormatItem("TimeFormat",1) w "datetime values (with seconds) are: ",!, $ZDATETIME("64701,56670.10",1,-1)," ",$ZDATETIME("64701,56673.27",1,-1),! &sql(SELECT DATEDIFF('ss','64701,56670.10','62871,56673.27') INTO :x) w "DATEDIFF number of seconds is: ",x,!! d ##class(%SYS.NLS.Format).SetFormatItem("TimeFormat",2) w "datetime values (without seconds) are: ",!, $ZDATETIME("64701,56670.10",1,-1)," ",$ZDATETIME("64701,56673.27",1,-1),! &sql(SELECT DATEDIFF('ss','64701,56670.10','64701,56673.27') INTO :x) w "DATEDIFF number of seconds is: ",x,! d ##class(%SYS.NLS.Format).SetFormatItem("TimeFormat",tfmt) } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLCommand).DateDiff() datetime values (with seconds) are: 02/22/2018 15:44:30 02/22/2018 15:44:33 DATEDIFF number of seconds is: -158111996.83 datetime values (without seconds) are: 02/22/2018 15:44 02/22/2018 15:44 DATEDIFF number of seconds is: 3.17 ``` # 范围和值检查 `DATEDIFF`对输入值执行以下检查: - 在执行任何`DATEDIFF`操作之前,开始日期和结束日期的所有指定部分必须是有效的。 - 日期字符串必须完整,格式正确,包含适当数量的元素和每个元素的数字,以及适当的分隔符。 年必须指定为四位数字。 如果省略输入值的日期部分,`DATEDIFF`默认为`' 1900-01-01 '`。 无效的日期值将导致`SQLCODE -8`错误。 - 日期和时间值必须在有效范围内。 年龄:`0001`到`9999`。 月份:`1 - 12`个月。 天数:`1 - 31`天。 营业时间:`00`至`23`。 分钟:`0`到`59`分钟。 秒:`0 ~ 59`。 一个月中的天数必须与月和年相匹配。 例如,日期`“02-29”`仅在指定的年份为闰年时有效。 无效的日期值将导致`SQLCODE -8`错误。 - 小于`10`(月和日)的日期值可以包括或省略前导零。 不允许使用其他非规范整数值。 因此,`Day`值为`“07”`或`“7”`是有效的,但`“007”`、`“7.0”`或`“7a”`无效。 - 时间值可以全部或部分省略。 如果`startdate`或`enddate`指定了一个不完整的时间,则为未指定的部分提供`0`。 - 小于`10`的小时值必须包含前导零。 省略前导零将导致`SQLCODE -8`错误。 # 错误处理 - 在`Embedded SQL`中,如果指定无效的`datepart`作为输入变量,则会发出`SQLCODE -8`错误码。 如果将无效的日期部分指定为文字,则会发生``错误。 如果将无效的开始日期或结束日期指定为输入变量或文字,则会发出`SQLCODE -8`错误码。 - 在动态SQL中,如果您提供了无效的日期部分、开始日期或结束日期,则`DATEDIFF`函数将返回一个`NULL`值。 没有发出`SQLCODE`错误。 # 示例 下面的例子返回`353`,因为两个时间戳之间有`353`天(D): ```sql SELECT DATEDIFF(D,'2018-01-01 00:00:00','2018-12-20 12:00:00') 353 ``` 在下面的示例中,每个`DATEDIFF`返回`1`,因为日期的年份部分相差1。 日期之间的实际持续时间不被考虑: ```sql SELECT DATEDIFF('yyyy','1910-08-21','1911-08-21') AS ExactYear, DATEDIFF('yyyy','1910-06-30','1911-01-01') AS HalfYear, DATEDIFF('yyyy','1910-01-01','1911-12-31') AS Nearly2Years, DATEDIFF('yyyy','1910-12-31 11:59:59','1911-01-01 00:00:00') AS NewYearSecond 1 1 1 1 ``` 注意,上面的例子使用了日期部分的缩写。 但是,你可以指定全名,如下例所示: ```sql SELECT DATEDIFF('year','2017-09-10 13:19:00','2018-12-20 00:00:00') 1 ``` 下面的嵌入式SQL示例使用主机变量执行与前面示例相同的`DATEDIFF`操作: ```sql ClassMethod DateDiff1() { s x="year" s date1="2017-09-10 13:19:00" s date2="2018-12-20 00:00:00" &sql(SELECT DATEDIFF(:x,:date1,:date2) INTO :diff) w diff } ``` ``` 1 ``` 下面的例子使用`WHERE`子句中的`DATEDIFF`来选择上周入院的患者: ```sql SELECT Name,DateOfAdmission FROM Sample.Patients WHERE DATEDIFF(D,DateOfAdmission,$HOROLOG)
文章
Michael Lei · 八月 26, 2021

SAM - 设置和添加非 IRIS 目标指标的技巧和提示

# SAM - 设置和添加非 IRIS 目标指标的技巧和提示 SAM(系统警报和监视)以“功能齐全”的 docker-compose 容器集的形式提供,只要启动就可以开始以默认的仪表板监视 IRIS 实例。 使用初始配置就可以很好地了解 SAM 功能并开始对 IRIS 系统进行基本监视。 但是,当开始监视多个系统并收集大量指标数据时,需要更改一些默认设置。 为了从 SAM 获取更多价值,您还会想要添加来自其他数据源(目标)的指标。 以下技巧将帮助您在生产环境中部署 SAM,从多个目标收集指标并将这些指标组合到您自己的仪表板和图表中。 此外,您还将看到一些可能有助于探索 SAM 容器和应用程序的命令。 > *注意:*我应该指出,其中一些技巧和提示可能不是最佳做法;这更像是一个日志,记录了我第一次如何配置 SAM 来监视相同系统上的多个服务器和非 IRIS 目标的基准。 如果您有建议,请在评论中指教 ;) 所以,记住本帖可能会随着时间的推移而有所变化,让我们开始吧; --- 在下面的技巧中,有重启 docker 以及启动和停止 SAM 的操作。 请通读这些技巧,确定哪些适合您,然后按照下面的相同顺序执行。 ## 1. 确保有足够的空间用于 SAM 数据库 默认情况下,docker 容器将文件存储在根 (/) 文件系统。 SAM 不需要很多 CPU 或内存资源;但是,指标收集将占用空间。 > 指标需要的存储容量“视情况而定”。 虽然在开始监视之前可能无法明确数据库大小,但大致上,在抓取周期为 15 秒的情况下,监视 10 个 IRIS 虚拟机以及操作系统指标大约消耗 50GB 存储。 策略包括:增加监视实例的根存储,或更改数据库的卷位置。 我使用了以下命令来更改运行 docker 的虚拟机上的 docker 目录。 也许是杀鸡用了牛刀,但很管用。 - 停止 docker 并将 docker 文件复制到空间充足的文件系统(本例中为 /data/docker/data)。 见下面的示例: ```other [root@mysamserver lib]# sudo systemctl stop docker [root@mysamserver lib]# pwd /var/lib [root@mysamserver lib]# cp -rp docker /data/docker/data [root@mysamserver lib]# [root@mysamserver lib]# rm -rf docker ``` - 在 docker 配置文件中更新卷路径。 注意此文件还有一个网络设置“bip”(请参见注释:...) ```swift cat /etc/docker/daemon.json { "data-root": "/data/docker/data", "bip": "192.168.0.1/24" } ``` - 重启 docker ```swift sudo systemctl daemon-reload sudo systemctl restart docker systemctl status docker.service ``` ## 2. 设置 SAM 我假定您已在测试系统上设置 SAM,并熟悉它的基本操作:添加集群和实例,以及查看系统指标。 建议您花 20 分钟时间查看我在虚拟全球峰会 2020 上的展示,以了解安装步骤的概述,以及添加多个目标的运行指标时 SAM 的外观。 要观看此会议,请使用以下链接(您需要使用您的电子邮件注册): [DEV007 系统警报和监视](https://intersystems.6connex.com/event/virtual-summit/en-us/contents/434680/share?rid=Lobby&nid=804450) 登录到 SAM 门户并配置一些 IRIS 实例。 这会填充配置文件并提供向导。 `http://mysamserver:8080/api/sam/app/index.csp#/` > 注意:如果要添加多个实例,或者希望用脚本执行此步骤,可以通过 API 添加实例。 请参见文档。 ## 3. 升级到生产许可证 SAM 随附了一个 IRIS 社区版许可证。 有几个限制,包括 IRIS.DAT 限制为 10GB。 10GB 不足以长时间从多个目标收集数据。 请联系您的 InterSystems 联系人以获取生产许可证。 在没有编辑器的情况下,在精简的容器中更新许可证可能很棘手,我只是在 IRIS 容器上登录一个交互式会话,然后使用以下命令更新许可证密钥: - 打开 shell,切换目录至 mgr 文件夹(iris.key 文件的默认位置) ```swift docker exec -it sam_iris_1 bash cd /dur/iconfig/mgr ``` - 使用 unix“here 文档”更新密钥。 在“>”后面粘贴密钥文本。 在密钥文本后面,输入“>EOF”以提交命令。 然后输入“exit”退出 shell。 ```other cat [ConfigFile] FileType=InterSystems License Rev-A.1 LicenseID=999999 [License] LicenseCapacity=InterSystems IRIS 2020.2 Server for SAM:etc etc, the key you were sent by your InterSystems contact. >EOF exit ``` - 然后使用提供的 docker-compose shell 脚本停止再启动 SAM: ```swift ./stop.sh ./start.sh ``` - 可以通过访问系统管理门户或登录到 iris 实例并检查 messages.log 来检查许可证是否一切正常。 ```shell docker exec -it sam_iris_1 bash cd /dur/iconfig/mgr cat messages.log ``` ## 4. 在目标上安装其他 prometheus 导出程序 例如,prometheus 节点导出程序可显示各种硬件和内核相关的指标。 [节点导出程序文档](https://prometheus.io/docs/guides/node-exporter/) 通过请求(抓取)实例端点的指标,测试节点导出程序是否正常工作: ```swift curl my_target_server_name:9100/metrics ``` 您应该看到类似下面的信息: ```swift mylaptop:~ mo$ my_target_server_name:9100/metrics | more HELP go_gc_duration_seconds A summary of the GC invocation durations. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 4.8862e-05 go_gc_duration_seconds{quantile="0.25"} 7.5898e-05 go_gc_duration_seconds{quantile="0.5"} 9.2974e-05 go_gc_duration_seconds{quantile="0.75"} 0.000130664 go_gc_duration_seconds{quantile="1"} 0.000358762 go_gc_duration_seconds_sum 303.291715258 go_gc_duration_seconds_count 2.572586e+06 # HELP go_goroutines Number of goroutines that currently exist. # TYPE go_goroutines gauge go_goroutines 9 : : many many metrics will be displayed ``` 注意您可以对您的 IRIS 实例执行同样操作: ```swift mylaptop:~ mo$ curl my_target_server_name:52776/api/monitor/metrics | more iris_cpu_pct{id="AUXWD"} 0 iris_cpu_pct{id="CSPDMN"} 0 iris_cpu_pct{id="CSPSRV"} 0 iris_cpu_pct{id="ECPCliR"} 0 iris_cpu_pct{id="ECPCliW"} 0 iris_cpu_pct{id="ECPSrvR"} 0 iris_cpu_pct{id="ECPSrvW"} 0 : : many many metrics will be displayed ``` ## 5. 编辑配置文件以添加对新目标的抓取 例如,前一个技巧中的 node-exporter 实例。 配置文件将位于 SAM 的安装位置。 如下所示,可以看到 grafana 和 prometheus `yml` 配置文件。 ```plaintext [root@mysamserver sam-1.0.0.115-unix]# ls config docker-compose.yml readme.txt start.sh stop.sh [root@mysamserver sam-1.0.0.115-unix]# tree -x config config ├── alertmanager │   └── isc_alertmanager.yml ├── grafana │   ├── dashboard.json │   ├── dashboard-provider.yml │   ├── datasource.yml │   └── grafana.ini ├── nginx │   └── nginx.conf └── prometheus ├── isc_alert_rules.yml └── isc_prometheus.yml 4 directories, 8 files ``` ## 5.1 添加目标到 prometheus 以下示例是使用 SAM 中的配置 GUI 屏幕创建的 `isc_prometheus.yml` 文件。 该文件包含两个集群。 一个集群监视 sam 实例本身,另一个集群监视五个 IRIS 实例。 ```yaml alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 global: evaluation_interval: 15s scrape_interval: 15s remote_read: - url: http://iris:52773/api/sam/private/db/read remote_write: - url: http://iris:52773/api/sam/private/db/write rule_files: - ./isc_alert_rules.yml scrape_configs: - job_name: SAM metrics_path: /api/monitor/metrics scheme: http static_configs: - labels: cluster: "1" targets: - mysaminstance.mycompany.com:8080 - labels: cluster: "2" targets: - myiristarget1:52776 - myiristarget2:52776 - myiristarget3:52776 - myiristarget4:52776 - myiristarget5:52776 ``` - 要添加对其他运行 node-exporter 的目标的抓取,请将以下内容添加到 `isc_prometheus.yml` 文件的底部。 注意 API `metrics_path` 与 IRIS 不同。 ```yaml alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 global: evaluation_interval: 15s scrape_interval: 15s remote_read: - url: http://iris:52773/api/sam/private/db/read remote_write: - url: http://iris:52773/api/sam/private/db/write rule_files: - ./isc_alert_rules.yml scrape_configs: - job_name: SAM metrics_path: /api/monitor/metrics scheme: http static_configs: - labels: cluster: "1" targets: - iscsydsam.iscinternal.com:8080 - labels: cluster: "2" targets: - myiristarget1:52776 - myiristarget2:52776 - myiristarget3:52776 - myiristarget4:52776 - myiristarget5:52776 - job_name: node_shard1 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget1:9100 - job_name: node_shard2 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget2:9100 - job_name: node_shard3 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget3:9100 - job_name: node_shard4 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget4:9100 - job_name: node_shard5 metrics_path: /metrics scheme: http static_configs: - labels: cluster: "2" group: node targets: - myiristarget5:9100 ``` - 然后使用提供的 docker-compose shell 脚本停止再启动 SAM: ```swift ./stop.sh ./start.sh ``` SAM 现在从您通过 GUI 添加的 IRIS 实例以及相同实例上的 node-exporter 中收集指标。 # 6. 增加 Prometheus 收集指标的天数 在 SAM 的第一版中,您可以在 GUI 中更改收集指标的天数。 但是,我在显示所有指标时遇到一个问题。 在我弄清楚发生了什么之前,我更改了 Prometheus 中的保留天数,否则 SAM 将收集数据,但是您在 Grafana 的 Prometheus 查询中看不到指标。 在文件 `docker-compose.yml` 中用来安装 SAM 的层,更改 Prometheus 启动时设置的保留天数,例如在 `prometheus` 部分中,更新 `storage.tsdb.retention.time` 参数以匹配所需的保留天数: ```swift prometheus: command: - --web.enable-lifecycle - --config.file=/config/isc_prometheus.yml - --storage.tsdb.retention.time=30d ``` > 注意:在 SAM 的第一版中,最长保留天数为 30 天。 然后使用提供的 docker-compose shell 脚本停止再启动 SAM: ```swift ./stop.sh ./start.sh ``` ## 7. 创建您自己的仪表板 您可以向现有仪表板添加面板,也可以创建新的仪表板以满足您的监视需求。 这是一个很大的主题,所以留到下一个帖子再说。 不过,这里先帮助您上手。 在 SAM 屏幕上使用 `View in Grafana`(在 Grafana 中查看)按钮切换到 Grafana。 ![DraggedImage.png](https://res.craft.do/user/full/635e53bd-527a-1620-0e31-f8c3bdff1139/doc/CB3E6427-4D46-40C7-93DF-9E1FE801E814/C1AAEA2C-B8AF-4CF6-AB18-DD562971A9BC_2) 打开 Grafana 后,可以创建或编辑仪表板; ![DraggedImage-1.png](https://res.craft.do/user/full/635e53bd-527a-1620-0e31-f8c3bdff1139/doc/CB3E6427-4D46-40C7-93DF-9E1FE801E814/BC370FDF-308A-4917-9262-42AE286BDE8B_2) 网上有许多查询导出程序(如 node-exporter)的示例。 > 当可以显示 IRIS 系统指标(SAM 中的默认设置)、IRIS 应用程序指标(您需要将这些指标构建到应用程序中)以及其他指标(如 node-exporter 或由供应商创建的任何数量的指标)时,真正强大的功能才体现出来。 例如,[使用 SAM 和 cAdvisor 监视 Docker 容器](https://community.intersystems.com/post/monitor-docker-containers-using-sam-and-cadvisor)