sumo-search 0.1.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.cane +0 -0
  3. data/.gitignore +0 -2
  4. data/.travis.yml +7 -0
  5. data/README.md +54 -27
  6. data/Rakefile +8 -3
  7. data/bin/sumo +2 -69
  8. data/lib/sumo/cli.rb +43 -0
  9. data/lib/sumo/client.rb +82 -0
  10. data/lib/sumo/collection.rb +97 -0
  11. data/lib/sumo/config.rb +11 -14
  12. data/lib/sumo/error.rb +8 -11
  13. data/lib/sumo/search.rb +69 -0
  14. data/lib/sumo/version.rb +9 -2
  15. data/lib/sumo.rb +52 -18
  16. data/spec/fixtures/sumo-creds +1 -0
  17. data/spec/lib/sumo/client_spec.rb +136 -0
  18. data/spec/lib/sumo/config_spec.rb +55 -74
  19. data/spec/lib/sumo/search_spec.rb +106 -0
  20. data/spec/lib/sumo_spec.rb +0 -30
  21. data/spec/spec_helper.rb +5 -7
  22. data/spec/support/vcr.rb +41 -5
  23. data/spec/vcr/Sumo_Search/_create/sets_the_id_and_client.yml +42 -0
  24. data/spec/vcr/Sumo_Search/_delete_/deletes_the_search.yml +102 -0
  25. data/spec/vcr/Sumo_Search/_messages/returns_an_Enumerator_of_each_message_in_the_search.yml +2579 -0
  26. data/spec/vcr/Sumo_Search/_records/returns_an_Enumerator_of_each_record_in_the_search.yml +2348 -0
  27. data/spec/vcr/Sumo_Search/_status/returns_the_status_of_the_search.yml +71 -0
  28. data/sumo-search.gemspec +5 -6
  29. metadata +62 -57
  30. data/lib/sumo/formatter.rb +0 -21
  31. data/lib/sumo/query_builder.rb +0 -61
  32. data/spec/fixtures/sumo_creds +0 -1
  33. data/spec/lib/sumo/formatter_spec.rb +0 -51
  34. data/spec/lib/sumo/query_builder_spec.rb +0 -128
  35. data/spec/vcr/Sumo/_search/when_the_credentials_can_be_found/and_the_query_is_valid/parses_the_response.yml +0 -49
  36. data/spec/vcr/Sumo/_search/when_the_credentials_can_be_found/but_the_query_is_invalid/raises_an_error.yml +0 -43
  37. data/spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_invalid/raises_an_error.yml +0 -43
  38. data/spec/vcr/Sumo_QueryBuilder/integration/when_the_request_is_valid/compiles_and_sends_the_query_to_the_server.yml +0 -49
@@ -1,128 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sumo::QueryBuilder do
4
- subject { Sumo::QueryBuilder.new('fake-creds') }
5
-
6
- describe '.new' do
7
- context 'when the correct types of arguments are supplied' do
8
- subject { Sumo::QueryBuilder.new('auth', 'q' => 'error') }
9
-
10
- it 'creates a new QueryBuilder' do
11
- subject.creds.should == 'auth'
12
- subject.opts.should == { 'q' => 'error' }
13
- end
14
- end
15
-
16
- context 'when invalid arguments are supplied' do
17
- it 'raises an error' do
18
- expect { Sumo::QueryBuilder.new(:symbol, 1) }
19
- .to raise_error(Sumo::Error::TypeError)
20
- end
21
- end
22
- end
23
-
24
- describe '#query' do
25
- it 'adds a query to the request' do
26
- subject.query('alpha').opts.should == { 'q' => 'alpha' }
27
- end
28
- end
29
-
30
- describe '#to' do
31
- it 'adds an end time to the request' do
32
- subject.to('now').opts.should == { 'to' => 'now' }
33
- end
34
- end
35
-
36
- describe '#from' do
37
- it 'adds an end time to the request' do
38
- subject.from('-15m').opts.should == { 'from' => '-15m' }
39
- end
40
- end
41
-
42
- describe '#time_zone' do
43
- it 'adds a time zone to the request' do
44
- subject.time_zone('UTC').opts.should == { 'tz' => 'UTC' }
45
- end
46
- end
47
-
48
- describe '#format' do
49
- it 'adds a format to the request' do
50
- subject.format('JSON').opts.should == { 'format' => 'JSON' }
51
- end
52
- end
53
-
54
- describe '#execute' do
55
- let(:creds) { 'user@example.com:pass' }
56
- let(:encoded) { Base64.encode64(creds) }
57
- let(:conn) { double(:connection) }
58
- let(:query) {
59
- {
60
- 'q' => 'production',
61
- 'from' => '-30m',
62
- 'to' => '-15m',
63
- 'tz' => 'UTC',
64
- 'format' => 'json'
65
- }
66
- }
67
- subject {
68
- Sumo::QueryBuilder.new(creds).query('production')
69
- .from('-30m')
70
- .to('-15m')
71
- .time_zone('UTC')
72
- .format('json')
73
- }
74
-
75
- before do
76
- subject.stub(:connection).and_return(conn)
77
- conn.stub(:get)
78
- .with(:path => '/api/v1/logs/search',
79
- :query => query,
80
- :headers => { 'Authorization' => "Basic #{encoded}" })
81
- .and_return(resp)
82
- end
83
-
84
- context 'when the server responds' do
85
- let(:resp) { double(:response, :body => '{}', :status => 200) }
86
-
87
- it 'parses the response' do
88
- subject.execute.should == '{}'
89
- end
90
- end
91
-
92
- context 'when the server does not respond' do
93
- let(:resp) { double(:response, :body => nil, :status => 504) }
94
-
95
- it 'raises an error' do
96
- expect { subject.execute }.to raise_error(Sumo::Error::RequestError)
97
- end
98
- end
99
- end
100
-
101
- describe 'integration', :vcr do
102
- # WARNING: If you are going to change this VCR, modify the credentials so
103
- # that they are valid, record the VCR, remove the credentials from it, and
104
- # change the below variable back to its original form.
105
- let(:creds) { 'aladdin@swipely.com:open sesame' }
106
-
107
- context 'when the request is valid' do
108
- let(:result) { JSON.parse(subject.execute) }
109
- subject { Sumo::QueryBuilder.new(creds).query('nginx') }
110
-
111
- it 'compiles and sends the query to the server' do
112
- result.length.should_not be_zero
113
- result.should be_all { |hash|
114
- %w(_sourcecategory _raw _sourcehost _receipttime _sourcename
115
- _messagetime).all? { |key| hash.has_key?(key) }
116
- }
117
- end
118
- end
119
-
120
- context 'when the request is invalid' do
121
- subject { Sumo::QueryBuilder.new(creds).query('nginx').to('nonsense') }
122
-
123
- it 'raises an error' do
124
- expect { subject.execute }.to raise_error(Sumo::Error::RequestError)
125
- end
126
- end
127
- end
128
- end
@@ -1,49 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.sumologic.com/api/v1/logs/search?q=rails
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - excon/0.31.0
12
- Authorization:
13
- - |
14
- Basic YWxhZGRpbkBzd2lwZWx5LmNvbTpvcGVuIHNlc2FtZQ==
15
- response:
16
- status:
17
- code: 200
18
- message:
19
- headers:
20
- Cache-control:
21
- - no-cache="set-cookie"
22
- Content-Type:
23
- - application/json; charset=ISO-8859-1
24
- Date:
25
- - Tue, 07 Jan 2014 18:32:15 GMT
26
- Expires:
27
- - Thu, 01-Jan-1970 00:00:00 GMT
28
- Set-Cookie:
29
- - JSESSIONID=p8dhtx823tvbbxs578ipt3mn;Path=/api, AWSELB=D5C1176F0665104977B708B0B48E6FFEC09E311CD1473A91FD800B5F0A2443FAC23088ACED0D807762BB3B769CEAADA14ED5C9BC9C86BA1749DC556A5C1B04944D462E0D92;PATH=/
30
- Content-Length:
31
- - '1052'
32
- Connection:
33
- - Close
34
- body:
35
- encoding: UTF-8
36
- string: |-
37
- [
38
- {
39
- "_sourcecategory" : "all",
40
- "_raw" : "{\"@source\":\"syslog://\",\"@tags\":[\"railslog\"],\"@fields\":{\"facility\":\"local0\",\"severity\":[\"notice\",\"D\"],\"program\":\"swipely-ledger-delayed-1\",\"processid\":\"-\",\"sslsubject\":[\"/C=US/ST=Rhode Island/O=Swipely/OU=Engineering/CN=s-ledger\",\"/C=US/ST=Rhode Island/O=Swipely/OU=Engineering/CN=s-ledger\"],\"host\":[\"s-ledger\"],\"timestamp\":[\"140107-18:26:50.605\"],\"thread_id\":[\"8_15364200\"],\"msg\":[\"** [Honeybadger] Environment Info: [Ruby: 1.9.3] [Rails: 3.2.11] [Env: staging]\"]},\"@timestamp\":\"2014-01-07T18:26:54.159449+00:00\",\"@source_host\":\"ip-10-244-158-144\",\"@message\":\"Jan 7 18:26:54 swipely-ledger-delayed-1:D 140107-18:26:50.605 8_15364200: ** [Honeybadger] Environment Info: [Ruby: 1.9.3] [Rails: 3.2.11] [Env: staging]\",\"@type\":\"syslog\"}",
41
- "_sourcehost" : "logs.example.com",
42
- "_receipttime" : 1389119226829,
43
- "_sourcename" : "/media/ephemeral0/logs/swipely/s-ledger-2014-01-07.log",
44
- "_messagetime" : 1389119214159
45
- }
46
- ]
47
- http_version:
48
- recorded_at: Tue, 07 Jan 2014 18:32:19 GMT
49
- recorded_with: VCR 2.8.0
@@ -1,43 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.sumologic.com/api/v1/logs/search?from=never&q=Rails
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - excon/0.31.0
12
- Authorization:
13
- - |
14
- Basic YWxhZGRpbkBzd2lwZWx5LmNvbTpvcGVuIHNlc2FtZQ==
15
- response:
16
- status:
17
- code: 400
18
- message:
19
- headers:
20
- Cache-control:
21
- - no-cache="set-cookie"
22
- Content-Type:
23
- - application/json; charset=ISO-8859-1
24
- Date:
25
- - Tue, 07 Jan 2014 18:30:35 GMT
26
- Set-Cookie:
27
- - AWSELB=D5C1176F0665104977B708B0B48E6FFEC09E311CD1473A91FD800B5F0A2443FAC23088ACED0D807762BB3B769CEAADA14ED5C9BC9C86BA1749DC556A5C1B04944D462E0D92;PATH=/
28
- Content-Length:
29
- - '154'
30
- Connection:
31
- - Close
32
- body:
33
- encoding: UTF-8
34
- string: |-
35
- {
36
- "status" : 400,
37
- "id" : "9IJJK-HJQ9G-H09X3",
38
- "code" : "search.invalid.timestamp.from",
39
- "message" : "The 'from' field contains an invalid time."
40
- }
41
- http_version:
42
- recorded_at: Tue, 07 Jan 2014 18:30:39 GMT
43
- recorded_with: VCR 2.8.0
@@ -1,43 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.sumologic.com/api/v1/logs/search?q=nginx&to=nonsense
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - excon/0.31.0
12
- Authorization:
13
- - |
14
- Basic YWxhZGRpbkBzd2lwZWx5LmNvbTpvcGVuIHNlc2FtZQ==
15
- response:
16
- status:
17
- code: 400
18
- message:
19
- headers:
20
- Cache-control:
21
- - no-cache="set-cookie"
22
- Content-Type:
23
- - application/json; charset=ISO-8859-1
24
- Date:
25
- - Tue, 07 Jan 2014 15:52:16 GMT
26
- Set-Cookie:
27
- - AWSELB=D5C1176F0665104977B708B0B48E6FFEC09E311CD10EE26CC6F86FEAE76E4BBB3D728D261CADA16D6256329826144A742E70346FDF2C8592D1FAF5BF2ABFF69B2FDD5A38FA;PATH=/
28
- Content-Length:
29
- - '150'
30
- Connection:
31
- - Close
32
- body:
33
- encoding: UTF-8
34
- string: |-
35
- {
36
- "status" : 400,
37
- "id" : "ELTN2-7BBZF-ZCZQ8",
38
- "code" : "search.invalid.timestamp.to",
39
- "message" : "The 'to' field contains an invalid time."
40
- }
41
- http_version:
42
- recorded_at: Tue, 07 Jan 2014 15:52:18 GMT
43
- recorded_with: VCR 2.8.0
@@ -1,49 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://api.sumologic.com/api/v1/logs/search?q=nginx
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- User-Agent:
11
- - excon/0.31.0
12
- Authorization:
13
- - |
14
- Basic YWxhZGRpbkBzd2lwZWx5LmNvbTpvcGVuIHNlc2FtZQ==
15
- response:
16
- status:
17
- code: 200
18
- message:
19
- headers:
20
- Cache-control:
21
- - no-cache="set-cookie"
22
- Content-Type:
23
- - application/json; charset=ISO-8859-1
24
- Date:
25
- - Tue, 07 Jan 2014 15:49:55 GMT
26
- Expires:
27
- - Thu, 01-Jan-1970 00:00:00 GMT
28
- Set-Cookie:
29
- - JSESSIONID=1dybd1qub96gu13g5a9qh9dyqc;Path=/api, AWSELB=D5C1176F0665104977B708B0B48E6FFEC09E311CD1473A91FD800B5F0A2443FAC23088ACEDDBBB8C99D44C2403D82B59D74368F2FCC1FFB75ECAF9255D4A40FE87F45B4364;PATH=/
30
- transfer-encoding:
31
- - ''
32
- Connection:
33
- - Close
34
- body:
35
- encoding: UTF-8
36
- string: |-
37
- [
38
- {
39
- "_sourcecategory" : "all",
40
- "_raw" : "nonsense result",
41
- "_sourcehost" : "ls01.logs.swipely.com",
42
- "_receipttime" : 1389109434302,
43
- "_sourcename" : "/media/ephemeral0/logs/swipely/p-ledger-lb-2014-01-07.log",
44
- "_messagetime" : 1389109430911
45
- }
46
- ]
47
- http_version:
48
- recorded_at: Tue, 07 Jan 2014 15:49:59 GMT
49
- recorded_with: VCR 2.8.0