使用grep4j轻松测试分布式组件上的SLA
因此,您的分布式體系結構如下圖所示,您剛剛從企業那里收到了一項要求,以確保生產者發送并隨后傳輸到下游系統(消費者)的消息的SLA必須快且永遠不會慢于此。 400毫秒。
要求說:
從生產者發送到任何消費者的消息的延遲絕不應慢于400毫秒。
聽起來很熟悉? 對我來說,經驗告訴我,如果將來我想保護SLA,則還需要使測試自動化,以免引入瓶頸,而這會增加消息的延遲。 但是怎么做呢? 生產者和使用者位于不同的機器中,并且某些使用者不是用Java編寫的。 另外,在生產者和消費者之間有一個隊列(或Web服務或RMI或ESB或其他組件或其他任何東西),因此測試起來并不容易。 好吧,所有組件都以類似的方式寫入日志,那么為什么不使用日志作為測試數據呢?
例如,這些是2個示例日志,一個來自生產者發出消息(id 1546366),另一個來自接收消息的使用者之一(id 1546366):
生產者日志
2013-02-19 10:09:05,795 INFO [org.grep4j.demo.input.core.InputCoreMessageSender] (pool-19-thread-9) Input::MessageSender::Message(1546366) Sent Successfully消費者日志
2013-02-19 10:09:06,161 INFO [org.grep4j.demo.handler.bean.mdb.SingleDestPacketHandler] (Thread-62314 (HornetQ-client-global-threads-989457197)) Handler::Packet::Message(1546366) Received::PacketId(982336426)::State(NORMAL)::Dest(CONSUMER4, 1)::DataLevel(EVENT, 7)::Op(CREATE, C)::GlobalId(1546366)::Priority(1)::Src(GUI, 1::Ids(EventId=1546366,SFBId=1546366,isBirType=false,inBir=false))這就是我使用Grep4j進行自動性能測試的樣子:
package com.gdg.grep4j.demo; import static com.gdg.grep4j.demo.profiles.Profiles.consumer1; import static com.gdg.grep4j.demo.profiles.Profiles.consumer2; import static com.gdg.grep4j.demo.profiles.Profiles.consumer3; import static com.gdg.grep4j.demo.profiles.Profiles.producer; import static com.gdg.grep4j.demo.services.TimeService.extractTime; import static org.grep4j.core.Grep4j.constantExpression; import static org.grep4j.core.Grep4j.grep; import static org.grep4j.core.fluent.Dictionary.on; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.number.OrderingComparison.lessThan; import static org.junit.Assert.assertThat; import org.grep4j.core.result.GrepResults; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @Test public class MessageDistributionPerformanceTest {private static final long MAX_ACCETABLE_LATENCY = 400L;private long producerTime = 0;private GrepResults consumersResults;@BeforeTestpublic void triggerMessageDispatcher() {System.out.println('Producing and firing a Message(1546366) to downstream systems...');}@BeforeTestpublic void extractProducerTime() {GrepResults producerResult = grep(constantExpression('Message(1546366) Sent Successfully'), on(producer));producerTime = extractTime(producerResult.toString());}@BeforeTestpublic void grepConsumerLogs() {consumersResults = grep(constantExpression('Message(1546366) Received'),on(consumer1, consumer2, consumer3));}public void testConsumer1Latency() {long consumer1Time = extractTime(consumersResults.filterOnProfile(consumer1).toString());assertThat((consumer1Time - producerTime),is(lessThan(MAX_ACCETABLE_LATENCY)));}public void testConsumer2Latency() {long consumer2Time = extractTime(consumersResults.filterOnProfile(consumer2).toString());assertThat((consumer2Time - producerTime),is(lessThan(MAX_ACCETABLE_LATENCY)));}public void testConsumer3Latency() {long consumer3Time = extractTime(consumersResults.filterOnProfile(consumer3).toString());assertThat((consumer3Time - producerTime),is(lessThan(MAX_ACCETABLE_LATENCY)));} }配置文件是grep目標上下文,在我的情況下,所有配置文件都是遠程計算機(要更好地了解配置文件,請參閱Grep4j頁面 )。
TimeService只是一個簡單的服務類,用于提取日志中的時間。
package com.gdg.grep4j.demo.services; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TimeService {private static final Pattern timePattern = Pattern.compile('([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9]) ([0-9][0-9]|2[0-3]):([0-9][0-9]):([0-9][0-9]),([0-9][0-9][0-9])');public static long extractTime(String text) {Matcher lm = timePattern.matcher(text);if (lm.find()) {SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss,SSS');sdf.setTimeZone(TimeZone.getTimeZone('UTC'));String inputString = lm.group();Date date = null;try {date = sdf.parse(inputString);} catch (ParseException e) {e.printStackTrace();}return date.getTime();} else {throw new IllegalArgumentException('timePattern not found');}} } 在幾行簡單的代碼中,我進行了非常靈活的測試(我可以測試日志中生成的任何內容)。 對于完整的代碼: https : //github.com/marcocast/grep4j-gdg.git
參考:通過我們的JCG合作伙伴 Marco Castigliego的grep4j ,可以在“ 刪除重復和修復不良名稱”博客上輕松測試分布式組件上的SLA 。
翻譯自: https://www.javacodegeeks.com/2013/02/easy-testing-slas-on-distributed-components-with-grep4j.html
總結
以上是生活随笔為你收集整理的使用grep4j轻松测试分布式组件上的SLA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaFX即将推出您附近的Androi
- 下一篇: VISTA如何系统还原(WindowsV