2016-06-01 4 views
0

マイクロサービスで実装された.jsonファイルからヘルスチェックとポートステータスをチェックするスクリプトを作成しました。 したがって、.jsonファイルのすべてのマイクロサービスに対して、スクリプトはHTTPステータスと健全性検査の本文およびその他の細かい詳細を出力します。また、すべての出力を一度に返すためにここにマルチスレッドを追加します。スクリプト内でマルチスレッド/コンカレントを追加する

#!/usr/bin/env ruby 
... get the environment argument part... 

file = File.read('./services.json') 
data_hash = JSON.parse(file) 

threads = [] 
service = data_hash.keys 
service.each do |microservice| 
threads << Thread.new do 
    begin 
    puts "Microservice: #{microservice}" 
    port = data_hash["#{microservice}"]['port'] 
    puts "Port: #{port}" 

    nodes = "knife search 'chef_environment:#{env} AND recipe:#{microservice}' -i" 
    node = %x[ #{nodes} ].split 
    node.each do |n| 
    puts "Node: #{n}" 
    uri = URI("http://#{n}:#{port}/healthcheck?count=10") 
    res = Net::HTTP.get_response(uri) 
    status = Net::HTTP.get(uri) 
    puts res.code 
    puts status 
    puts res.message 
    end 

rescue Net::ReadTimeout 
    puts "ReadTimeout Error" 
    next 
end 
end 
end 
threads.each do |thread| 
    thread.join 
end 
#!/usr/bin/env ruby 
... get the environment argument part... 

file = File.read('./services.json') 
data_hash = JSON.parse(file) 

threads = [] 
service = data_hash.keys 
service.each do |microservice| 
threads << Thread.new do 
    begin 
    puts "Microservice: #{microservice}" 
    port = data_hash["#{microservice}"]['port'] 
    puts "Port: #{port}" 

    nodes = "knife search 'chef_environment:#{env} AND recipe:#{microservice}' -i" 
    node = %x[ #{nodes} ].split 
    node.each do |n| 
    puts "Node: #{n}" 
    uri = URI("http://#{n}:#{port}/healthcheck?count=10") 
    res = Net::HTTP.get_response(uri) 
    status = Net::HTTP.get(uri) 
    puts res.code 
    puts status 
    puts res.message 
    end 

rescue Net::ReadTimeout 
    puts "ReadTimeout Error" 
    next 
end 
end 
end 
threads.each do |thread| 
    thread.join 
end 

とにかくこのスクリプトはputs「Microservice:#{microservice}」を返し、「Port:#{port}」を置きます。この後、STATUSの後にのみノードが返されます。 各ループのすべてのデータを一緒に返すにはどうすればよいですか?

+0

Vlad、 'map'メソッドをチェックしてください。非常に便利です。 'threads = service.map ...'を実行することで、コードを単純化することができます。また、 'service'はおそらく複数形を示す' services'と名付けられるべきです。 –

答えて

1

putsの代わりに、変数(ハッシュ)に出力を書き込みます。 出力を表示する前にすべてのスレッドが完了するのを待つ場合は、ThreadsWaitクラスを使用してください。

require 'thwait' 
file = File.read('./services.json') 
data_hash = JSON.parse(file) 

h = {} 
threads = [] 
service = data_hash.keys 
service.each do |microservice| 
threads << Thread.new do 
    thread_id = Thread.current.object_id.to_s(36) 
    begin 
    h[thread_id] = "Microservice: #{microservice}" 
    port = data_hash["#{microservice}"]['port'] 
    h[thread_id] << "Port: #{port}" 

    nodes = "knife search 'chef_environment:#{env} AND recipe:#{microservice}' -i" 
    node = %x[ #{nodes} ].split 
    node.each do |n| 
    h[thread_id]<< "Node: #{n}" 
    uri = URI("http://#{n}:#{port}/healthcheck?count=10") 
    res = Net::HTTP.get_response(uri) 
    status = Net::HTTP.get(uri) 
    h[thread_id] << res.code 
    h[thread_id] << status 
    h[thread_id] << res.message 
    end 

rescue Net::ReadTimeout 
    h[thread_id] << "ReadTimeout Error" 
    next 
end 
end 
end 
threads.each do |thread| 
    thread.join 
end 

# wait untill all threads finish their job 
ThreadsWait.all_waits(*threads) 

p h 

[編集]

ThreadsWait.all_waits(*threads)は、上記のコードで冗長であり、ラインtreads.each do |thread| thread.join endがexactely同じことがないので、省略することができます。

+0

ありがとう、ideeaのための多くのおかげで、基本的にこのようなハッシュを返します{"8x694" => "マイクロサービス:microservice1Port:27580Node:node404 {\" ... –

+1

スレッド結合はより簡潔に ' threads.each(&:join) 'を実行します。これはすべてのスレッドが完了するのを待っていませんか? 'ThreadsWait'は何を追加しますか? –

+0

Vlad、そうです。文字列の最後に新しい行があるはずです(私のように)。また、私が便利だと分かったのは、文字列を作成する代わりに、説明的なキー名を使ってハッシュを構築することです。その後、awesome_printを使って非常に読みやすい方法で出力することができます。 –

1

putsを使用してデータを出力する代わりに、すべてを文字列で収集し、最後にputsを収集することができます。文字列は、あなただけの文字列を初期化することができますので、(Rubyではメソッドとして実装)<<演算子を取る、それに追加して、最後に出力して、このようなことができます。

report = '' 
report << 'first thing' 
report << 'second thing' 
puts report 

あなたも彼らを救うことができますあなたが望むならば、すべて一緒にアップして、すべてを終えた後にそれらをすべて印刷してください。

+0

私はこの解決法も試してみました。新しい行の各項目を見るためにこれを壊す方法はありますか? –

+1

レポートを配列に変更する: 'report = []'そして最後に 'puts report.join(" \ n ")' – maicher

関連する問題