Contenu connexe Similaire à Empowerment through Observability - Keynote (20) Plus de Abigail Bangser (12) Empowerment through Observability - Keynote1. My slides are / will be available for you at:
@A_Bangser @AgileTD #AgileTD
Empowerment through Observability
Abby Bangser
(she/her)
https://www.slideshare.net/AbigailBangser
37. @A_Bangser @AgileTD #AgileTD
le= 0.05 le= 0.1 le= 0.5 le= 1 le= 5 le= +inf
* “le” stands for “less than or equal to”
www.moo.com/big_file in 5 seconds
www.moo.com in 0.25 seconds
38. @A_Bangser @AgileTD #AgileTD
le= 0.05 le= 0.1 le= 0.5 le= 1 le= 5 le= +inf
* “le” stands for “less than or equal to”
www.moo.com/big_file in 5 seconds
www.moo.com in 0.25 seconds
39. @A_Bangser @AgileTD #AgileTD
le= .05 le= .1 le= .5 le= 1 le= 5 le= +inf
1week2week3week4week
le= .05 le= .1 le= .5 le= 1 le= 5 le= +inf
le= .05 le= .1 le= .5 le= 1 le= 5 le= +inf
le= .05 le= .1 le= .5 le= 1 le= 5 le= +inf
43. @A_Bangser @AgileTD #AgileTD
le= .05 le= 5le= .5le= .1 le= +infle= 1
1week2week3week4week
le= .05 le= .1 le= +infle= 1
le= 5le= .1 le= +infle= 1
le= .05 le= 5le= .1 le= .5
le= .05
le= .5
le= .5
le= 1
le= 5
le= +inf
56. @A_Bangser @AgileTD #AgileTD
grok {
match => [
"Request",
"%{URIPROTO:request_uri_scheme}://
%{HOSTNAME:request_uri_host}(?::%{POSINT:request_uri_port})
?%{URIPATH:request_uri_path}(?:%{URIPARAM:request_uri_query})?"
]}
}
57. @A_Bangser @AgileTD #AgileTD
mutate {
split => { "uri_array" => "/"}
add_field => {
"uri_root" => ["/%{[uri_array][1]}"]
"uri_first" => ["/%{[uri_array][2]}"]
"uri_second" => ["/%{[uri_array][3]}"]
"uri_root_first" => "%{uri_root}%{uri_first}"
"uri_root_second" => "%{uri_root}%{uri_first}%{uri_second}"
}
61. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
62. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
63. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
64. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
65. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
66. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
67. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
LOGGER.info("Successfully flipped image id: {}", file.getId()");
68. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
LOGGER.info("Successfully flipped image id: {}", file.getId()");
69. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(@RequestParam("image") MultipartFile file,
@RequestParam(value = "vertical") Boolean vertical,
@RequestParam(value = "horizontal") Boolean horizontal) {
if (file.getContentType() != null) {
LOGGER.warn("Wrong content type uploaded: {}", file.getContentType());
return new ResponseEntity<>("Wrong content type uploaded: " + file.getContentType());
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
if (flippedImage == null) {
return new ResponseEntity<>("Failed to flip image", HttpStatus.INTERNAL_SERVER_ERROR);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
71. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
72. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
73. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("content.type", file.getContentType());
74. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
75. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
76. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("flip_vertical", vertical);
EVENT.addField("image_id", file.getId());
77. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
LOGGER.info("Receiving {} image to flip.", file.getContentType());
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("flip_vertical", vertical);
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_horizontal", horizontal);
78. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("flip_vertical", vertical);
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_horizontal", horizontal);
79. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("flip_vertical", vertical);
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_horizontal", horizontal);
80. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("flip_vertical", vertical);
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_horizontal", horizontal);
81. @A_Bangser @AgileTD #AgileTD
@PostMapping("flip")
public ResponseEntity flipImage(...) {
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_vertical", vertical);
EVENT.addField("flip_horizontal", horizontal);
...
LOGGER.info("Receiving {} image to flip.", file.getContentType());
byte[] flippedImage = imageService.flip(file, vertical, horizontal);
...
LOGGER.info("Successfully flipped image id: {}", file.getId());
EVENT.addField("action.success", "true");
return new ResponseEntity<>(flippedImage, headers, HttpStatus.OK);
}
EVENT.addField("action.success", "true");
EVENT.addField("content.type", file.getContentType());
EVENT.addField("action", "flip");
EVENT.addField("flip_vertical", vertical);
EVENT.addField("image_id", file.getId());
EVENT.addField("flip_horizontal", horizontal);
109. @A_Bangser @AgileTD #AgileTD
➔
➔
➔ structured data
➔ arbitrarily wide events
➔ schema-less-ness
➔ high cardinality dimensions
➔ oriented around the lifecycle of the request
➔ batched up context
➔ static dashboards don’t work, it must be
exploratory
ByTwitter,CCBY4.0,https://commons.wikimedia.org/w/index.php?curid=80936515
110. @A_Bangser @AgileTD #AgileTD
➔ raw events
➔ no pre-aggregation
➔
➔
➔
➔
➔ oriented around the lifecycle of the request
➔ batched up context
➔ static dashboards don’t work, it must be
exploratory
ByTwitter,CCBY4.0,https://commons.wikimedia.org/w/index.php?curid=80936515
111. @A_Bangser @AgileTD #AgileTD
➔ raw events
➔ no pre-aggregation
➔ structured data
➔ arbitrarily wide events
➔ schema-less-ness
➔ high cardinality dimensions
➔
➔
➔
ByTwitter,CCBY4.0,https://commons.wikimedia.org/w/index.php?curid=80936515
113. @A_Bangser @AgileTD #AgileTD
QA
TWU
Political
Science Major
Data analysis for
investments
A desire to
learn how to
code
Automation
FTW!
An “analyst”
computer
A “DevOps”
friend
engaged me
in his work
onitorama
An infrastructure
project
Platform
Engineering @
Professional
scuba diver
A (slight)
obsession with
observability
115. @A_Bangser @AgileTD #AgileTD
➔ All of tech and product is now asking more interesting questions
➔ We are expecting more of our tooling
➔ We are building new awareness about our services and system