Commit fa71aac0 authored by Seth Jennings's avatar Seth Jennings

bump(github.com/google/cadvisor): 27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6

parent 89cd583e
......@@ -1336,208 +1336,208 @@
},
{
"ImportPath": "github.com/google/cadvisor/api",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/cache/memory",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/client/v2",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/collector",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container/common",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container/docker",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container/libcontainer",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container/raw",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container/rkt",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/container/systemd",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/devicemapper",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/events",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/fs",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/healthz",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/http",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/http/mux",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/info/v1",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/info/v2",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/machine",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/manager",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/manager/watcher",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/manager/watcher/raw",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/manager/watcher/rkt",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/metrics",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/pages",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/pages/static",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/storage",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/summary",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/cloudinfo",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/cpuload",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/docker",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/oomparser",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/sysfs",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/sysinfo",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/utils/tail",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/validate",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/version",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/cadvisor/zfs",
"Comment": "v0.26.1",
"Rev": "d19cc94b760cd8f150a0a5d95b404dec39a121a1"
"Comment": "v0.26.0-37-g27e1acb",
"Rev": "27e1acbb4ef0fe1889208b21f8f4a6d0863e02f6"
},
{
"ImportPath": "github.com/google/certificate-transparency/go",
......
......@@ -85,7 +85,7 @@ func handleRequest(supportedApiVersions map[string]ApiVersion, m manager.Manager
versions = append(versions, v)
}
sort.Strings(versions)
fmt.Fprintf(w, "Supported API versions: %s", strings.Join(versions, ","))
http.Error(w, fmt.Sprintf("Supported API versions: %s", strings.Join(versions, ",")), http.StatusBadRequest)
return nil
}
......@@ -109,7 +109,7 @@ func handleRequest(supportedApiVersions map[string]ApiVersion, m manager.Manager
if requestType == "" {
requestTypes := versionHandler.SupportedRequestTypes()
sort.Strings(requestTypes)
fmt.Fprintf(w, "Supported request types: %q", strings.Join(requestTypes, ","))
http.Error(w, fmt.Sprintf("Supported request types: %q", strings.Join(requestTypes, ",")), http.StatusBadRequest)
return nil
}
......
......@@ -127,15 +127,13 @@ func GetSpec(cgroupPaths map[string]string, machineInfoFactory info.MachineInfoF
func readString(dirpath string, file string) string {
cgroupFile := path.Join(dirpath, file)
// Ignore non-existent files
if !utils.FileExists(cgroupFile) {
return ""
}
// Read
out, err := ioutil.ReadFile(cgroupFile)
if err != nil {
glog.Errorf("readString: Failed to read %q: %s", cgroupFile, err)
// Ignore non-existent files
if !os.IsNotExist(err) {
glog.Errorf("readString: Failed to read %q: %s", cgroupFile, err)
}
return ""
}
return strings.TrimSpace(string(out))
......@@ -158,13 +156,12 @@ func readUInt64(dirpath string, file string) uint64 {
// Lists all directories under "path" and outputs the results as children of "parent".
func ListDirectories(dirpath string, parent string, recursive bool, output map[string]struct{}) error {
// Ignore if this hierarchy does not exist.
if !utils.FileExists(dirpath) {
return nil
}
entries, err := ioutil.ReadDir(dirpath)
if err != nil {
// Ignore if this hierarchy does not exist.
if os.IsNotExist(err) {
err = nil
}
return err
}
for _, entry := range entries {
......
......@@ -80,7 +80,7 @@ func parseThinLsOutput(output []byte) map[string]uint64 {
deviceID := fields[0]
usage, err := strconv.ParseUint(fields[1], 10, 64)
if err != nil {
glog.Warning("unexpected error parsing thin_ls output: %v", err)
glog.Warningf("unexpected error parsing thin_ls output: %v", err)
continue
}
......
......@@ -79,6 +79,8 @@ type RealFsInfo struct {
// Map from label to block device path.
// Labels are intent-specific tags that are auto-detected.
labels map[string]string
// Map from mountpoint to mount information.
mounts map[string]*mount.Info
// devicemapper client
dmsetup devicemapper.DmsetupClient
}
......@@ -106,9 +108,14 @@ func NewFsInfo(context Context) (FsInfo, error) {
fsInfo := &RealFsInfo{
partitions: processMounts(mounts, excluded),
labels: make(map[string]string, 0),
mounts: make(map[string]*mount.Info, 0),
dmsetup: devicemapper.NewDmsetupClient(),
}
for _, mount := range mounts {
fsInfo.mounts[mount.Mountpoint] = mount
}
fsInfo.addRktImagesLabel(context, mounts)
// need to call this before the log line below printing out the partitions, as this function may
// add a "partition" for devicemapper to fsInfo.partitions
......@@ -125,6 +132,7 @@ func processMounts(mounts []*mount.Info, excludedMountpointPrefixes []string) ma
supportedFsType := map[string]bool{
// all ext systems are checked through prefix.
"btrfs": true,
"tmpfs": true,
"xfs": true,
"zfs": true,
}
......@@ -152,25 +160,12 @@ func processMounts(mounts []*mount.Info, excludedMountpointPrefixes []string) ma
// btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo.
// instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point
if mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") {
buf := new(syscall.Stat_t)
err := syscall.Stat(mount.Source, buf)
major, minor, err := getBtrfsMajorMinorIds(mount)
if err != nil {
glog.Warningf("stat failed on %s with error: %s", mount.Source, err)
glog.Warningf("%s", err)
} else {
glog.Infof("btrfs mount %#v", mount)
if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK {
err := syscall.Stat(mount.Mountpoint, buf)
if err != nil {
glog.Warningf("stat failed on %s with error: %s", mount.Mountpoint, err)
} else {
glog.Infof("btrfs dev major:minor %d:%d\n", int(major(buf.Dev)), int(minor(buf.Dev)))
glog.Infof("btrfs rdev major:minor %d:%d\n", int(major(buf.Rdev)), int(minor(buf.Rdev)))
mount.Major = int(major(buf.Dev))
mount.Minor = int(minor(buf.Dev))
}
}
mount.Major = major
mount.Minor = minor
}
}
......@@ -444,6 +439,7 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) {
if err != nil {
return nil, fmt.Errorf("stat failed on %s with error: %s", dir, err)
}
major := major(buf.Dev)
minor := minor(buf.Dev)
for device, partition := range self.partitions {
......@@ -451,6 +447,16 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) {
return &DeviceInfo{device, major, minor}, nil
}
}
mount, found := self.mounts[dir]
if found && mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") {
major, minor, err := getBtrfsMajorMinorIds(mount)
if err != nil {
glog.Warningf("%s", err)
} else {
return &DeviceInfo{mount.Source, uint(major), uint(minor)}, nil
}
}
return nil, fmt.Errorf("could not find device with major: %d, minor: %d in cached partitions map", major, minor)
}
......@@ -644,3 +650,32 @@ func (b *byteCounter) Write(p []byte) (int, error) {
b.bytesWritten += uint64(len(p))
return len(p), nil
}
// Get major and minor Ids for a mount point using btrfs as filesystem.
func getBtrfsMajorMinorIds(mount *mount.Info) (int, int, error) {
// btrfs fix: following workaround fixes wrong btrfs Major and Minor Ids reported in /proc/self/mountinfo.
// instead of using values from /proc/self/mountinfo we use stat to get Ids from btrfs mount point
buf := new(syscall.Stat_t)
err := syscall.Stat(mount.Source, buf)
if err != nil {
err = fmt.Errorf("stat failed on %s with error: %s", mount.Source, err)
return 0, 0, err
}
glog.Infof("btrfs mount %#v", mount)
if buf.Mode&syscall.S_IFMT == syscall.S_IFBLK {
err := syscall.Stat(mount.Mountpoint, buf)
if err != nil {
err = fmt.Errorf("stat failed on %s with error: %s", mount.Mountpoint, err)
return 0, 0, err
}
glog.Infof("btrfs dev major:minor %d:%d\n", int(major(buf.Dev)), int(minor(buf.Dev)))
glog.Infof("btrfs rdev major:minor %d:%d\n", int(major(buf.Rdev)), int(minor(buf.Rdev)))
return int(major(buf.Dev)), int(minor(buf.Dev)), nil
} else {
return 0, 0, fmt.Errorf("%s is not a block device", mount.Source)
}
}
......@@ -44,7 +44,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
mux.HandleFunc(validate.ValidatePage, func(w http.ResponseWriter, r *http.Request) {
err := validate.HandleRequest(w, containerManager)
if err != nil {
fmt.Fprintf(w, "%s", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
......@@ -104,15 +104,9 @@ func RegisterPrometheusHandler(mux httpmux.Mux, containerManager manager.Manager
}
func staticHandlerNoAuth(w http.ResponseWriter, r *http.Request) {
err := static.HandleRequest(w, r.URL)
if err != nil {
fmt.Fprintf(w, "%s", err)
}
static.HandleRequest(w, r.URL)
}
func staticHandler(w http.ResponseWriter, r *auth.AuthenticatedRequest) {
err := static.HandleRequest(w, r.URL)
if err != nil {
fmt.Fprintf(w, "%s", err)
}
static.HandleRequest(w, r.URL)
}
......@@ -94,6 +94,14 @@ func (self *Node) AddPerCoreCache(c Cache) {
}
}
type HugePagesInfo struct {
// huge page size (in kB)
PageSize uint64 `json:"page_size"`
// number of huge pages
NumPages uint64 `json:"num_pages"`
}
type DiskInfo struct {
// device name
Name string `json:"name"`
......@@ -158,6 +166,9 @@ type MachineInfo struct {
// The amount of memory (in bytes) in this machine
MemoryCapacity uint64 `json:"memory_capacity"`
// HugePages on this machine.
HugePages []HugePagesInfo `json:"hugepages"`
// The machine id
MachineID string `json:"machine_id"`
......
......@@ -52,6 +52,9 @@ type Attributes struct {
// The system uuid
SystemUUID string `json:"system_uuid"`
// HugePages on this machine.
HugePages []v1.HugePagesInfo `json:"hugepages"`
// Filesystems on this machine.
Filesystems []v1.FsInfo `json:"filesystems"`
......
......@@ -17,8 +17,10 @@ package machine
import (
"bytes"
"flag"
"fmt"
"io/ioutil"
"path/filepath"
"strconv"
"strings"
"syscall"
......@@ -31,6 +33,8 @@ import (
"github.com/golang/glog"
)
const hugepagesDirectory = "/sys/kernel/mm/hugepages/"
var machineIdFilePath = flag.String("machine_id_file", "/etc/machine-id,/var/lib/dbus/machine-id", "Comma-separated list of files to check for machine-id. Use the first one that exists.")
var bootIdFilePath = flag.String("boot_id_file", "/proc/sys/kernel/random/boot_id", "Comma-separated list of files to check for boot-id. Use the first one that exists.")
......@@ -48,6 +52,45 @@ func getInfoFromFiles(filePaths string) string {
return ""
}
// GetHugePagesInfo returns information about pre-allocated huge pages
func GetHugePagesInfo() ([]info.HugePagesInfo, error) {
var hugePagesInfo []info.HugePagesInfo
files, err := ioutil.ReadDir(hugepagesDirectory)
if err != nil {
// treat as non-fatal since kernels and machine can be
// configured to disable hugepage support
return hugePagesInfo, nil
}
for _, st := range files {
nameArray := strings.Split(st.Name(), "-")
pageSizeArray := strings.Split(nameArray[1], "kB")
pageSize, err := strconv.ParseUint(string(pageSizeArray[0]), 10, 64)
if err != nil {
return hugePagesInfo, err
}
numFile := hugepagesDirectory + st.Name() + "/nr_hugepages"
val, err := ioutil.ReadFile(numFile)
if err != nil {
return hugePagesInfo, err
}
var numPages uint64
// we use sscanf as the file as a new-line that trips up ParseUint
// it returns the number of tokens successfully parsed, so if
// n != 1, it means we were unable to parse a number from the file
n, err := fmt.Sscanf(string(val), "%d", &numPages)
if err != nil || n != 1 {
return hugePagesInfo, fmt.Errorf("could not parse file %v contents %q", numFile, string(val))
}
hugePagesInfo = append(hugePagesInfo, info.HugePagesInfo{
NumPages: numPages,
PageSize: pageSize,
})
}
return hugePagesInfo, nil
}
func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.MachineInfo, error) {
rootFs := "/"
if !inHostNamespace {
......@@ -65,6 +108,11 @@ func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.Mach
return nil, err
}
hugePagesInfo, err := GetHugePagesInfo()
if err != nil {
return nil, err
}
filesystems, err := fsInfo.GetGlobalFsInfo()
if err != nil {
glog.Errorf("Failed to get global filesystem information: %v", err)
......@@ -99,6 +147,7 @@ func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.Mach
NumCores: numCores,
CpuFrequency: clockSpeed,
MemoryCapacity: memoryCapacity,
HugePages: hugePagesInfo,
DiskMap: diskMap,
NetworkDevices: netDevices,
Topology: topology,
......
......@@ -113,16 +113,18 @@ func (c *containerData) allowErrorLogging() bool {
return false
}
func (c *containerData) GetInfo() (*containerInfo, error) {
func (c *containerData) GetInfo(shouldUpdateSubcontainers bool) (*containerInfo, error) {
// Get spec and subcontainers.
if time.Since(c.lastUpdatedTime) > 5*time.Second {
err := c.updateSpec()
if err != nil {
return nil, err
}
err = c.updateSubcontainers()
if err != nil {
return nil, err
if shouldUpdateSubcontainers {
err = c.updateSubcontainers()
if err != nil {
return nil, err
}
}
c.lastUpdatedTime = time.Now()
}
......
......@@ -400,7 +400,7 @@ func (self *manager) GetContainerSpec(containerName string, options v2.RequestOp
var errs partialFailure
specs := make(map[string]v2.ContainerSpec)
for name, cont := range conts {
cinfo, err := cont.GetInfo()
cinfo, err := cont.GetInfo(false)
if err != nil {
errs.append(name, "GetInfo", err)
}
......@@ -449,7 +449,7 @@ func (self *manager) GetContainerInfoV2(containerName string, options v2.Request
infos := make(map[string]v2.ContainerInfo, len(containers))
for name, container := range containers {
result := v2.ContainerInfo{}
cinfo, err := container.GetInfo()
cinfo, err := container.GetInfo(false)
if err != nil {
errs.append(name, "GetInfo", err)
infos[name] = result
......@@ -473,7 +473,7 @@ func (self *manager) GetContainerInfoV2(containerName string, options v2.Request
func (self *manager) containerDataToContainerInfo(cont *containerData, query *info.ContainerInfoRequest) (*info.ContainerInfo, error) {
// Get the info from the container.
cinfo, err := cont.GetInfo()
cinfo, err := cont.GetInfo(true)
if err != nil {
return nil, err
}
......
......@@ -190,6 +190,13 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo
return metricValues{{value: float64(s.Cpu.CFS.ThrottledTime) / float64(time.Second)}}
},
}, {
name: "container_cpu_load_average_10s",
help: "Value of container cpu load average over the last 10 seconds.",
valueType: prometheus.GaugeValue,
getValues: func(s *info.ContainerStats) metricValues {
return metricValues{{value: float64(s.Cpu.LoadAverage)}}
},
}, {
name: "container_memory_cache",
help: "Number of bytes of page cache memory.",
valueType: prometheus.GaugeValue,
......@@ -579,6 +586,84 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo
return values
},
}, {
name: "container_network_tcp_usage_total",
help: "tcp connection usage statistic for container",
valueType: prometheus.GaugeValue,
extraLabels: []string{"tcp_state"},
getValues: func(s *info.ContainerStats) metricValues {
return metricValues{
{
value: float64(s.Network.Tcp.Established),
labels: []string{"established"},
},
{
value: float64(s.Network.Tcp.SynSent),
labels: []string{"synsent"},
},
{
value: float64(s.Network.Tcp.SynRecv),
labels: []string{"synrecv"},
},
{
value: float64(s.Network.Tcp.FinWait1),
labels: []string{"finwait1"},
},
{
value: float64(s.Network.Tcp.FinWait2),
labels: []string{"finwait2"},
},
{
value: float64(s.Network.Tcp.TimeWait),
labels: []string{"timewait"},
},
{
value: float64(s.Network.Tcp.Close),
labels: []string{"close"},
},
{
value: float64(s.Network.Tcp.CloseWait),
labels: []string{"closewait"},
},
{
value: float64(s.Network.Tcp.LastAck),
labels: []string{"lastack"},
},
{
value: float64(s.Network.Tcp.Listen),
labels: []string{"listen"},
},
{
value: float64(s.Network.Tcp.Closing),
labels: []string{"closing"},
},
}
},
}, {
name: "container_network_udp_usage_total",
help: "udp connection usage statistic for container",
valueType: prometheus.GaugeValue,
extraLabels: []string{"udp_state"},
getValues: func(s *info.ContainerStats) metricValues {
return metricValues{
{
value: float64(s.Network.Udp.Listen),
labels: []string{"listen"},
},
{
value: float64(s.Network.Udp.Dropped),
labels: []string{"dropped"},
},
{
value: float64(s.Network.Udp.RxQueued),
labels: []string{"rxqueued"},
},
{
value: float64(s.Network.Udp.TxQueued),
labels: []string{"txqueued"},
},
}
},
}, {
name: "container_tasks_state",
help: "Number of tasks in given state",
extraLabels: []string{"state"},
......@@ -610,6 +695,7 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo
},
},
}
return c
}
......
......@@ -163,7 +163,7 @@ func printUnit(bytes uint64) string {
return ByteSize(bytes).Unit()
}
func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error {
func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) {
start := time.Now()
// The container name is the path after the handler
......@@ -175,14 +175,16 @@ func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) e
}
cont, err := m.GetContainerInfo(containerName, &reqParams)
if err != nil {
return fmt.Errorf("failed to get container %q with error: %v", containerName, err)
http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound)
return
}
displayName := getContainerDisplayName(cont.ContainerReference)
// Get the MachineInfo
machineInfo, err := m.GetMachineInfo()
if err != nil {
return err
http.Error(w, fmt.Sprintf("failed to get machine info: %v", err), http.StatusInternalServerError)
return
}
rootDir := getRootDir(containerName)
......@@ -241,7 +243,6 @@ func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) e
}
glog.V(5).Infof("Request took %s", time.Since(start))
return nil
}
// Build a relative path to the root of the container page.
......
......@@ -51,7 +51,7 @@ func toStatusKV(status info.DockerStatus) ([]keyVal, []keyVal) {
}, ds
}
func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error {
func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) {
start := time.Now()
// The container name is the path after the handler
......@@ -66,7 +66,8 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error
}
conts, err := m.AllDockerContainers(&reqParams)
if err != nil {
return fmt.Errorf("failed to get container %q with error: %v", containerName, err)
http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound)
return
}
subcontainers := make([]link, 0, len(conts))
for _, cont := range conts {
......@@ -79,14 +80,16 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error
// Get Docker status
status, err := m.DockerInfo()
if err != nil {
return err
http.Error(w, fmt.Sprintf("failed to get docker info: %v", err), http.StatusInternalServerError)
return
}
dockerStatus, driverStatus := toStatusKV(status)
// Get Docker Images
images, err := m.DockerImages()
if err != nil {
return err
http.Error(w, fmt.Sprintf("failed to get docker images: %v", err), http.StatusInternalServerError)
return
}
dockerContainersText := "Docker Containers"
......@@ -110,7 +113,8 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error
}
cont, err := m.DockerContainer(containerName[1:], &reqParams)
if err != nil {
return fmt.Errorf("failed to get container %q with error: %v", containerName, err)
http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound)
return
}
displayName := getContainerDisplayName(cont.ContainerReference)
......@@ -128,7 +132,8 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error
// Get the MachineInfo
machineInfo, err := m.GetMachineInfo()
if err != nil {
return err
http.Error(w, fmt.Sprintf("failed to get machine info: %v", err), http.StatusInternalServerError)
return
}
data = &pageData{
DisplayName: displayName,
......@@ -153,5 +158,5 @@ func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) error
}
glog.V(5).Infof("Request took %s", time.Since(start))
return nil
return
}
......@@ -77,37 +77,25 @@ func init() {
func containerHandlerNoAuth(containerManager manager.Manager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
err := serveContainersPage(containerManager, w, r.URL)
if err != nil {
fmt.Fprintf(w, "%s", err)
}
serveContainersPage(containerManager, w, r.URL)
}
}
func containerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFunc {
return func(w http.ResponseWriter, r *auth.AuthenticatedRequest) {
err := serveContainersPage(containerManager, w, r.URL)
if err != nil {
fmt.Fprintf(w, "%s", err)
}
serveContainersPage(containerManager, w, r.URL)
}
}
func dockerHandlerNoAuth(containerManager manager.Manager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
err := serveDockerPage(containerManager, w, r.URL)
if err != nil {
fmt.Fprintf(w, "%s", err)
}
serveDockerPage(containerManager, w, r.URL)
}
}
func dockerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFunc {
return func(w http.ResponseWriter, r *auth.AuthenticatedRequest) {
err := serveDockerPage(containerManager, w, r.URL)
if err != nil {
fmt.Fprintf(w, "%s", err)
}
serveDockerPage(containerManager, w, r.URL)
}
}
......
......@@ -7,6 +7,7 @@ go_library(
"static.go",
],
visibility = ["//visibility:public"],
deps = ["//vendor/github.com/golang/glog:go_default_library"],
)
filegroup(
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -22,6 +22,8 @@ import (
"net/http"
"net/url"
"path"
"github.com/golang/glog"
)
const StaticResource = "/static/"
......@@ -47,16 +49,18 @@ var staticFiles = map[string][]byte{
"jquery-1.10.2.min.js": jqueryJs,
}
func HandleRequest(w http.ResponseWriter, u *url.URL) error {
func HandleRequest(w http.ResponseWriter, u *url.URL) {
if len(u.Path) <= len(StaticResource) {
return fmt.Errorf("unknown static resource %q", u.Path)
http.Error(w, fmt.Sprintf("unknown static resource %q", u.Path), http.StatusNotFound)
return
}
// Get the static content if it exists.
resource := u.Path[len(StaticResource):]
content, ok := staticFiles[resource]
if !ok {
return fmt.Errorf("unknown static resource %q", resource)
http.Error(w, fmt.Sprintf("unknown static resource %q", u.Path), http.StatusNotFound)
return
}
// Set Content-Type if we were able to detect it.
......@@ -65,6 +69,7 @@ func HandleRequest(w http.ResponseWriter, u *url.URL) error {
w.Header().Set("Content-Type", contentType)
}
_, err := w.Write(content)
return err
if _, err := w.Write(content); err != nil {
glog.Errorf("Failed to write response: %v", err)
}
}
......@@ -83,7 +83,7 @@ func (fi bindataFileInfo) Sys() interface{} {
return nil
}
var _pagesAssetsHtmlContainersHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x5a\x5b\x73\xdb\xb8\x15\x7e\x96\x7f\xc5\x29\xa7\x0f\xdb\x19\x93\x8a\x93\xbc\x74\x2b\x6b\x46\x2b\x27\x5d\x75\x1d\x3b\x63\xd9\xbb\xb3\x8f\x10\x09\x49\x88\x21\x82\x0b\x80\x96\x55\x8f\xff\x7b\x0f\x00\x52\x02\x6f\x92\x6f\x93\x54\x19\xc7\x22\x81\xf3\x9d\xef\xdc\x80\x03\xd2\x83\xbf\x85\xe1\x11\xc0\x58\x64\x1b\xc9\x16\x4b\x0d\xef\xdf\x9d\x7c\x84\x7f\x0b\xb1\xe0\x14\x26\x69\x1c\xc1\x88\x73\xb8\x32\x43\x0a\xae\xa8\xa2\xf2\x8e\x26\xd1\x11\x8a\x9c\xb3\x98\xa6\x8a\x26\x90\xa7\x09\x95\xa0\x97\x14\x46\x19\x89\xf1\x57\x31\x72\x0c\xbf\x53\xa9\x98\x48\xe1\x7d\xf4\x0e\x7e\x32\x13\x82\x62\x28\xf8\xc7\xbf\x10\x61\x23\x72\x58\x91\x0d\xa4\x42\x43\xae\x28\x42\x30\x05\x73\x86\x8a\xe9\x7d\x4c\x33\x0d\x2c\x85\x58\xac\x32\xce\x48\x1a\x53\x58\x33\xbd\xb4\x6a\x0a\x90\x08\x21\xfe\x2c\x20\xc4\x4c\x13\x9c\x4d\x70\x7e\x86\x57\x73\x7f\x1e\x10\x6d\xf8\x9a\xcf\x52\xeb\xec\xe7\x7e\x7f\xbd\x5e\x47\xc4\x72\x8d\x84\x5c\xf4\xb9\x9b\xa7\xfa\xe7\x93\xf1\xa7\x8b\xe9\xa7\x10\xf9\x1a\x89\x9b\x94\x53\xa5\x40\xd2\xbf\x72\x26\xd1\xd0\xd9\x06\x48\x86\x6c\x62\x32\x43\x8e\x9c\xac\x41\x48\x20\x0b\x49\x71\x4c\x0b\xc3\x76\x2d\x99\x66\xe9\xe2\x18\x94\x98\xeb\x35\x91\x14\x51\x12\xa6\xb4\x64\xb3\x5c\x57\x5c\x55\x72\x43\x8b\xfd\x09\xe8\x2c\x92\x42\x30\x9a\xc2\x64\x1a\xc0\x2f\xa3\xe9\x64\x7a\x8c\x18\x7f\x4c\xae\x7f\xbd\xbc\xb9\x86\x3f\x46\x57\x57\xa3\x8b\xeb\xc9\xa7\x29\x5c\x5e\xc1\xf8\xf2\xe2\x6c\x72\x3d\xb9\xbc\xc0\xab\xcf\x30\xba\xf8\x13\x7e\x9b\x5c\x9c\x1d\x03\x45\x47\xa1\x1a\x7a\x9f\x49\xc3\x1f\x49\x32\xe3\x44\x13\x37\x80\x29\xa5\x15\x02\x73\xe1\x08\xa9\x8c\xc6\x6c\xce\x62\xb4\x2b\x5d\xe4\x64\x41\x61\x21\xee\xa8\x4c\xd1\x1c\xc8\xa8\x5c\x31\x65\x42\xa9\x90\x5e\x82\x28\x9c\xad\x98\x26\xda\xde\x69\x18\x15\x1d\x85\xe1\xf0\xe8\x68\xb0\xd4\x2b\x3e\xc4\xc9\x83\x25\x25\xc9\xd0\x86\x60\xa0\x99\xe6\x74\x18\x8f\x92\x3b\xa6\x50\x73\x08\x0f\x0f\xd1\x19\x53\x19\x27\x9b\x0b\xb2\xa2\x8f\x8f\x83\xbe\x9b\xe2\xa6\x63\x76\xc2\x39\xd1\x54\x69\x9b\x09\x98\x1b\x89\x61\x00\x2b\x96\x22\x59\xbc\x18\x4f\xa7\x60\xb4\xd9\xd9\x9c\xa5\xb7\x18\x2e\x7e\x1a\x28\xbd\xc1\xd8\x2d\x29\xd5\x01\x2c\x25\x9d\x9f\x06\xa8\xe7\x4a\x08\xfd\xf8\xa8\x0c\xef\xb8\x3f\xc3\x0b\xf4\x3b\xc9\xc2\x0f\xd1\x09\xfe\x43\xc4\x28\x56\x2a\x18\x1e\xed\x34\x5f\x66\xc6\x42\xc2\x8d\x71\x2b\xfa\x5a\x3d\x16\xa4\x43\xdb\x73\x10\x63\x91\x9a\x64\xc7\xda\x6a\x10\xde\xeb\xaa\xff\x90\x3b\x32\x8d\x25\xc3\xc2\xda\x5a\xa2\xdc\xb5\x92\x71\x53\xcf\xb7\xbf\x72\x2a\x37\x21\xd2\x7d\x17\xbd\xb7\x8c\xbf\xa1\xb6\x41\xdf\xc9\x3c\x01\xa0\xcd\xc5\xdd\x10\x7a\x93\xd1\xd3\x40\xd3\x7b\xdd\xff\x86\x4c\xdd\xdd\xa0\x1d\x79\x61\xd7\xa7\xf0\x9b\x22\x19\xab\x41\xbe\x18\xd3\x73\xeb\x1b\x91\x8c\x97\x44\xea\x26\xda\xa0\x5f\xd6\xc3\x60\x26\x92\x4d\xa1\x20\x61\x77\x10\x73\xa2\xd4\x69\xb0\x65\xe2\xf2\x2e\x54\x4b\xb1\x8e\x09\xae\x9a\x30\x2c\xd6\xb1\x01\xa9\xe7\x46\xb0\x13\xe6\xa1\x5a\x85\x27\xef\x03\x60\xc9\x69\xc0\xc5\x42\x04\x5b\xb1\x3e\xd9\x7e\xad\xe8\x2b\x45\x86\x47\x3d\x7f\x20\xc3\x65\x20\x34\x64\xa9\x34\x43\xa6\x92\x4f\x86\xcd\x82\xc5\x9b\x28\xd7\x47\x41\xf3\x5b\xf0\x52\x7c\x26\x51\x34\x96\xf9\x6a\xe6\xa4\x1f\x1e\x24\xae\x2d\x14\xfe\x9e\xe1\xca\x98\xea\xf1\xd6\xcc\x9f\x4f\x21\xfa\x5a\xbd\xa7\x1e\x1f\xad\x42\xce\x86\x9e\xb1\x75\xc9\xe8\x1c\xeb\x06\x8d\x1f\xb6\x0c\x5d\x63\x90\x0c\x3b\x82\xce\x47\x14\x47\x80\xa6\x89\x01\x1e\xf4\x05\xdf\x39\xc5\x12\x77\x17\x0f\x0f\x6c\x0e\xd1\x44\x39\xa7\x1e\xf0\x15\x14\x9f\xc1\xf2\xe3\x8e\x64\x14\xf5\x13\x11\xdf\x1a\x8f\x9d\xd9\xdf\xb0\xb3\xc9\x91\xc1\xd9\xed\xaa\x1d\x39\x9f\xc8\x34\x9f\xc5\xbe\x47\x5e\x17\xbb\x0f\xc3\x0a\x1e\x32\xf9\xe0\x07\xce\x13\xe6\xb8\x25\x85\x0b\x29\xf2\xac\x16\x39\xe5\x01\xd8\xb0\xd5\x19\xf6\x2a\xc9\x59\x99\x5f\x06\xab\xa9\x24\x64\x9a\xae\x6c\x10\x2b\xf3\x77\x11\xac\x05\xcf\xf3\x5a\xb7\x0b\x9d\x07\x5d\x0c\xa6\x58\x91\xf9\x5b\x38\xf0\x4c\x32\xdc\x14\xc1\xe1\xd5\x1d\x98\xf3\x83\xfe\x73\xa9\xa1\xac\xb8\xf5\x5f\x8d\x9f\x4b\x79\x07\x03\x2d\x2e\x1a\xa8\x0c\xfb\x83\x42\x8b\x81\x09\x39\x99\x51\x6e\x7d\xe7\x63\x47\xbf\xd1\x8d\x71\x9d\x99\x3e\x84\xfa\xe0\xef\x84\xe7\xb6\x72\xeb\x75\x51\xf5\x9a\x33\x76\xc7\xad\xf7\x32\x6a\x53\x2d\x24\xfa\x72\x30\x93\xc3\x82\x90\x81\xea\x72\x56\x6f\xe7\x2b\xab\xbe\xe1\xab\x6e\x56\xcf\xf5\x97\x87\xdf\xf4\x97\x3f\x58\xf5\x57\x6f\xeb\x2e\x0c\x7d\xce\xad\x35\xa5\x27\x8b\x1b\x5d\xd9\xda\x56\xe3\xce\xaa\xc9\x0a\x5d\x74\x38\x43\x61\xfb\xe9\x4e\x55\xf0\x3e\x26\x67\x1d\xb4\x4b\x56\x6f\xc4\xe7\xe5\xd0\xcc\x7e\xe1\xf2\x24\x64\x56\xc6\xec\x5b\x95\x59\x26\x84\xf8\x73\xd4\x86\xd1\x66\x1b\x1e\x18\x44\x2e\x63\xaa\x46\x77\x84\x71\xd3\x36\xbf\x41\x0d\x4e\x94\xe0\xb6\xf5\xac\xd5\x9f\x53\x39\xce\x72\x5f\x59\x67\xa2\x79\x9e\xe8\xcc\x1f\x20\xb1\xc6\x34\xc0\x26\xbd\xd0\x18\xda\xde\x14\x30\x49\x28\x77\xdf\x83\xe1\xf8\xeb\x8d\x0b\xff\x0e\xb1\x58\xbc\xb1\xa3\x36\x74\x70\xdd\xc3\x66\x79\x6b\xf8\x7e\x95\xfb\xea\x08\xdb\x09\x13\xc7\x32\x47\x33\xc9\x52\xed\x6e\x36\x95\x41\x05\x26\x4f\xd9\x16\x46\xf9\x30\x4d\xe6\x7e\x10\x5b\x6c\xf9\x42\xee\xdf\xc8\x1c\x44\x02\x0b\x55\xb3\x68\x2c\xaa\x06\xed\x34\x76\xdb\x14\x8b\x57\x99\xa4\x6e\x5f\x6f\x0e\x1e\x93\xc5\xda\x1c\x48\x44\x33\x48\x46\x43\x4d\x21\xe0\xff\xf1\x12\xb7\xb9\x49\x3a\x17\xd1\x45\xbe\xb2\x72\xe5\x1a\xd3\x64\x5f\x2e\x35\xdb\x6b\x67\xc4\x17\xba\x12\x72\xf3\x7d\x13\xde\xe9\xdc\x93\xf3\x6e\x42\xe4\x9e\x16\x58\x98\xd7\xbb\xd7\x03\xab\x57\x00\xfb\x2f\xdd\xa3\xb8\x3b\x69\x0a\xf9\x1b\xbc\xb5\x47\xfe\x25\x59\x55\xe0\xbc\x51\xa1\xb4\x15\x49\xd3\xe8\x83\x35\xd2\x69\x6e\x21\xf9\x0a\x43\xa7\x6b\x92\xbd\xd5\x22\x87\x50\xad\xcb\x42\xd3\x62\x4f\xeb\x0b\xac\xf6\xa4\x0f\x58\x5e\x2f\xbd\xc2\xba\x4a\x17\xfa\xe2\xcd\xec\x46\x99\xd6\xa8\xbb\x13\xb7\x95\x57\xd4\x1f\x5a\xb2\x22\x72\xb3\xa7\x0d\x30\xb3\x8c\x06\x96\x2e\x9a\x8d\x40\x75\x5a\x51\xcc\x97\xd8\xe5\xdc\x31\xba\xde\xdf\x1e\x80\xd7\x21\xe4\x86\x71\xb8\x20\xf9\x82\x06\x55\x48\x73\x9a\xdd\xb6\x0c\x3f\xc4\x9a\xaf\x52\x60\xb3\xa1\x0e\x75\x3b\xbe\x39\x59\x29\x12\x6a\x91\x3d\xc9\xa0\x8e\x3e\xe3\x3b\x9a\x69\x5b\x8e\xa7\x18\xd8\x62\x4d\x4d\xc1\xc7\xe1\xb5\xd0\x84\x43\x99\x87\x1f\x6d\x66\x7a\xfe\x89\xb3\x1c\x3d\x83\x53\x42\x17\x78\xfb\x50\x63\xe7\x14\x3b\xd7\x3c\x7a\x32\x50\xc8\x0b\xce\x05\x49\x60\x84\x59\xb5\x07\x8f\xe3\x9c\x2a\xd0\xf6\x89\x94\xcf\xcc\x72\x32\x0f\x1f\xed\xa6\xda\x05\x86\xe3\xa1\xd9\xff\x5b\xf9\xb5\x43\xfe\x22\x29\xb9\x4d\xc4\x3a\xed\xc2\x74\x50\xb3\x72\x5a\x27\x68\x33\x35\x0e\xee\xce\xdf\x31\x4d\xca\x8d\xfa\x3b\x65\xca\xca\xaa\x3b\x1c\x86\x99\xec\xd7\xee\x78\x04\xa4\x58\x43\xfb\x81\x67\x6f\x08\x6b\xd3\x9a\xcb\xf1\x3f\xed\xd9\xb2\x62\xaa\x14\x0b\xf3\x7c\xbc\xa1\xa4\xe1\x93\x62\x62\x38\x23\x12\xfc\x8b\x30\x31\x07\x55\x19\x94\xeb\x88\x1b\x58\x0a\x1d\x3a\x57\xb4\x22\x43\x75\xaf\x52\x32\x14\x29\xc7\xa9\xbf\x0a\x0d\x65\xc0\xdc\x21\xb9\x45\xb2\xe9\xcd\xe7\xd0\x65\xd8\x6a\xd6\xc8\xa2\x77\x92\x97\xb0\x1d\xa3\xdc\x53\xe9\xf6\x7a\xad\xbc\xdb\x6f\x36\x23\xf7\x21\xf0\xb3\xcb\x3c\x7a\xad\xad\x3e\xcf\x2c\xca\x0b\xaa\xd7\x42\xde\x3e\xb3\x2a\x7b\xaf\x2f\xc7\x42\x71\xb1\xd9\x3f\xa7\x10\x7b\xf5\xd1\x44\x8a\xcc\x24\x7f\xb3\x40\x66\xb9\xd6\x62\x1b\xaf\x99\x4e\x01\x7f\xc2\x84\xce\x49\xce\x35\x94\x72\xb8\xa2\x2f\x16\xc8\xa9\x78\x9e\xed\x84\x9c\x9f\x53\xc7\x32\x54\x94\xd3\xd8\x1e\x01\xb6\xca\x20\x21\x9a\x14\xa2\x1e\x07\x20\x92\x91\x70\x49\x54\x26\xb2\x3c\x3b\x0d\xb4\xcc\x69\x71\x93\xde\xa3\x1d\x09\x45\xd8\x39\xe1\x8a\xb6\xa4\x98\x4b\xaf\x76\xc5\x65\xac\xdb\xf3\xab\x92\x98\x31\x9e\x69\xbd\xb9\xbd\x32\x13\x9c\x65\x0d\x2f\xe1\x11\xa9\x55\x65\x50\x77\x30\xd6\x46\x9a\x07\x20\x85\xb1\xd8\x7d\xb7\x86\xd9\xee\x92\xd3\x64\xb6\xd9\xeb\xb1\x66\xce\x17\x8f\x87\xf6\xa4\xed\x73\x16\xe4\x25\xb6\xd4\x8b\x65\x96\xeb\xe6\x2a\xb8\x5d\x96\x4b\x7a\xb3\x8d\xc6\x26\xa7\xb1\x7d\xbf\x40\xed\x27\x29\x85\x7d\x7c\xdc\xd8\x02\x4a\x5d\xd4\xce\xe8\x56\x56\x33\xbe\x56\xa1\x9f\xd5\x0f\xdb\x32\x3f\x33\x4e\xd5\x46\xe1\x19\xe5\xe9\x1d\xe4\x7c\x2b\xe3\xf6\xbe\xd6\x26\xb2\x1b\xa9\x63\x99\x1a\xe7\x4a\x8b\xd5\x17\xaa\x25\x8b\x9f\xeb\x8f\x03\x8b\x55\x6f\x9f\x07\x46\xee\x0d\xb7\xc9\x63\x28\xb4\xd7\x57\xac\x7d\xb9\x52\xeb\xa5\xac\x11\x58\x44\x16\xe7\x60\x3e\xf4\xea\x87\xcd\x96\xb7\x20\x3f\x2c\x35\x5a\xde\x9d\x1c\xca\x8e\xa7\x35\x55\x19\x98\xbe\xd9\xb6\x35\x3f\xd7\xd7\x0b\x96\x62\x71\x57\x5a\x5d\xff\x0d\x49\x98\xb8\x17\x71\xb8\x8d\xe7\xa9\x0e\x5a\xf7\xef\xed\xd6\xdd\x26\x67\xe1\x3b\xe4\xee\xcc\x43\xef\xd3\x93\x77\x35\xca\xdd\x0b\x4d\x2b\xc3\x4a\x37\x58\x43\x6a\x5f\x00\x5f\xe8\x43\xd7\x8c\x1c\x74\x63\xd1\x46\xfc\x7f\x7a\xb2\xd2\x6a\x39\x2d\xb8\xf3\x70\x4f\xcd\x8c\x8b\xf8\xb6\xee\x81\xe6\xfe\x58\xef\xc9\xdf\x30\x2c\x1d\x4b\x77\xcb\xa0\x3f\xe4\x0d\xec\x7f\x95\x5e\x0a\x2b\x8d\xd4\xbe\x22\xc9\x9f\x1e\x1e\xa2\xed\x1b\x54\xf7\xc6\xf9\xd8\xfc\xd1\x48\xf5\xfc\x6d\x6f\x35\x8e\x5b\xf6\xae\x7b\x95\x6b\xbf\x96\xef\x75\xed\x5f\x1f\x99\x4f\x22\xc9\xda\xbd\x1e\x31\x6a\xaa\x6f\x62\x8a\x49\xd5\x37\xf7\xee\x85\x3d\x86\xce\xfe\x69\xcb\xff\x02\x00\x00\xff\xff\x4b\x13\x4b\x6c\x3d\x25\x00\x00")
var _pagesAssetsHtmlContainersHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\xcd\x72\xdb\x38\x12\x3e\x4b\x4f\xd1\xc3\xda\xc3\x6c\x55\x48\xc5\x49\x2e\x9b\x95\x55\xa5\x51\x92\x1d\xed\x38\xb6\xcb\xb2\x67\x6a\x8e\x10\xd9\x22\x11\x83\x00\x07\x00\x25\x6b\x5d\x7e\xf7\x2d\x00\xa4\xc4\x5f\xc9\x7f\x95\x8c\x2e\x96\x08\x74\xf7\xd7\x5f\x77\x03\x0d\xc2\xe3\x9f\x7c\x7f\x08\x30\x13\xd9\x56\xd2\x38\xd1\xf0\xee\xed\xc9\x07\xf8\x8f\x10\x31\x43\x98\xf3\x30\x80\x29\x63\x70\x65\x86\x14\x5c\xa1\x42\xb9\xc6\x28\x18\x0e\x01\xce\x68\x88\x5c\x61\x04\x39\x8f\x50\x82\x4e\x10\xa6\x19\x09\x13\x2c\x47\xde\xc0\xef\x28\x15\x15\x1c\xde\x05\x6f\xe1\x67\x33\xc1\x2b\x86\xbc\x7f\xfe\x7b\x08\xb0\x15\x39\xa4\x64\x0b\x5c\x68\xc8\x15\x82\x4e\xa8\x82\x15\x65\x08\x78\x17\x62\xa6\x81\x72\x08\x45\x9a\x31\x4a\x78\x88\xb0\xa1\x3a\xb1\x66\x0a\x25\xc1\x10\xe0\xcf\x42\x85\x58\x6a\x42\x39\x10\x08\x45\xb6\x05\xb1\xaa\xce\x03\xa2\x0d\x5e\xf3\x49\xb4\xce\x3e\x8e\x46\x9b\xcd\x26\x20\x16\x6b\x20\x64\x3c\x62\x6e\x9e\x1a\x9d\xcd\x67\x9f\xcf\x17\x9f\xfd\x77\xc1\x5b\x23\x71\xc3\x19\x2a\x05\x12\xff\xca\xa9\xc4\x08\x96\x5b\x20\x59\xc6\x68\x48\x96\x0c\x81\x91\x0d\x08\x09\x24\x96\x88\x11\x68\x61\xd0\x6e\x24\xd5\x94\xc7\x6f\x40\x89\x95\xde\x10\x89\x43\x80\x88\x2a\x2d\xe9\x32\xd7\x35\xaa\x4a\x6c\x54\xd5\x26\x08\x0e\x84\x83\x37\x5d\xc0\x7c\xe1\xc1\x2f\xd3\xc5\x7c\xf1\x66\x08\xf0\xc7\xfc\xfa\xd7\x8b\x9b\x6b\xf8\x63\x7a\x75\x35\x3d\xbf\x9e\x7f\x5e\xc0\xc5\x15\xcc\x2e\xce\x3f\xcd\xaf\xe7\x17\xe7\x0b\xb8\xf8\x02\xd3\xf3\x3f\xe1\xb7\xf9\xf9\xa7\x37\x80\x54\x27\x28\x01\xef\x32\x69\xf0\x0b\x09\xd4\x90\x68\xe2\x06\xb0\x40\xac\x01\x58\x09\x07\x48\x65\x18\xd2\x15\x0d\x81\x11\x1e\xe7\x24\x46\x88\xc5\x1a\x25\xa7\x3c\x86\x0c\x65\x4a\x95\x09\xa5\x02\xc2\xa3\x21\x00\xa3\x29\xd5\x44\xdb\x27\x2d\xa7\x82\xa1\xef\x4f\x86\xc3\x71\xa2\x53\x36\x19\x02\x8c\x13\x24\xd1\xc4\x86\x60\xac\xa9\x66\x38\x09\xa7\xd1\x9a\x2a\x21\xc1\x87\xfb\xfb\xe0\x13\x55\x19\x23\xdb\x73\x92\xe2\xc3\xc3\x78\xe4\xa6\xb8\xe9\x3f\xf9\x3e\x9c\x11\x8d\x4a\xdb\x4c\xa0\x0c\x23\x83\x00\x52\xca\xe9\x8a\x62\x04\xb3\xc5\x02\x8c\x35\x3b\x9b\x51\x7e\x0b\x12\xd9\xa9\xa7\xf4\x96\xa1\x4a\x10\xb5\x07\x89\xc4\xd5\xa9\x77\x7f\x1f\x5c\x09\xa1\x1f\x1e\x94\xc1\x1d\x8e\x96\x42\x68\xa5\x25\xc9\xfc\xf7\xc1\x49\x70\x12\xa4\x94\x07\xa1\x52\xde\x64\xb8\xb7\x7c\x91\x19\x0f\x09\x33\xce\xa5\xf8\x52\x3b\x56\x49\x8f\xb5\xa7\x68\x0c\x05\x37\xc9\x8e\x52\xb5\x00\x1f\xa4\xea\xbf\x64\x4d\x16\xa1\xa4\x99\xde\x7b\xa2\xdc\x6f\x25\xc3\xb6\x9d\x6f\x7f\xe5\x28\xb7\xfe\x49\x70\xf2\x36\x78\x67\x11\x7f\x53\xde\x64\x3c\x72\x32\x8f\x50\xd0\x45\x71\xbf\x0a\xbd\xcd\xf0\xd4\xd3\x78\xa7\x47\xdf\xc8\x9a\xb8\xa7\x5e\xb7\xe6\xd8\xae\x4f\xfe\x37\x45\x32\xda\x50\xf9\x6c\x9d\x15\x5a\x5f\x09\x64\x98\x10\xa9\xdb\xda\xc6\xa3\xb2\x1e\xc6\x4b\x11\x6d\x0b\x03\x11\x5d\x43\xc8\x88\x52\xa7\xde\x0e\x89\xcb\x3b\x5f\x25\x62\x13\x12\x85\x1e\x4c\x8a\x75\x6c\x4c\x9a\xb9\xe1\xed\x85\x99\xaf\x52\xff\xe4\x9d\x07\x34\x3a\xf5\x98\x88\x85\xb7\x13\x1b\x91\xdd\xd7\x9a\xbd\x52\x64\x32\x1c\x54\x07\x32\x12\xa3\x6f\xc0\xa2\x34\x43\xa6\x92\x4f\x26\xed\x82\x4d\x4e\x8c\xdc\x28\xa2\x6b\xf3\x57\xb0\x52\x7c\x29\x91\x44\xa1\xcc\xd3\xa5\x93\xbe\xbf\x97\x84\xc7\x08\xff\xc8\x88\x44\xae\x67\x3b\x37\x3f\x9e\x42\x70\x59\x7f\xa6\x1e\x1e\xac\x41\x46\x27\x15\x67\x9b\x92\xc1\x19\xe5\xb7\x0f\x0f\xde\xa4\x63\xe8\x1a\xef\xb4\x41\x47\x26\xe3\x11\xa3\x05\x00\xe4\x91\x51\x3c\x1e\x09\xb6\x27\xc5\x02\x77\x3f\xee\xef\xe9\x0a\x82\xb9\x72\xa4\x1e\xe1\x0a\x8a\xcf\x38\xf9\xb0\x07\x19\x04\xa3\x48\x84\xb7\x86\xb1\x4f\xf6\x2f\xec\x7d\x72\x60\x92\x0f\x3d\xa6\x1d\xb8\x2a\x90\x45\xbe\x0c\xab\x8c\xbc\x2c\x76\xef\x27\x35\x7d\xe3\x51\xf2\xbe\x1a\xb8\x8a\x30\xa3\x4a\xfb\xb1\x14\x79\xd6\x88\x9c\xaa\x28\xb0\x61\x6b\x22\x1c\xd4\x92\xb3\x36\xbf\x0c\x56\xdb\x88\x4f\x35\xa6\x36\x88\xb5\xf9\xfb\x08\x36\x82\x57\x61\xad\x9f\x42\xc7\xa0\x8b\xc1\x42\x13\x9d\xbf\x06\x81\x9f\x24\x5d\xa3\x04\xa7\xaf\x49\x60\xce\x8e\xf2\xe7\x52\x43\x59\x71\xcb\x5f\x03\x9f\x4b\x79\xa7\x06\x3a\x28\x1a\xab\x8c\xf0\xd2\x8a\x51\xe3\x33\xb2\x44\x66\xb9\xab\xea\x0e\x7e\xc3\xad\xa1\xce\x4c\x9f\x40\x73\xf0\x77\xc2\x72\x5b\xb9\xcd\xba\xa8\xb3\xe6\x9c\xdd\x63\x1b\x3c\x0f\xda\x42\x0b\x49\x62\x1c\x2f\xe5\xa4\x00\x64\x54\xf5\x91\x35\xd8\x73\x65\xcd\xb7\xb8\xea\x47\xf5\x54\xbe\x2a\xfa\xdb\x7c\x55\x07\xeb\x7c\x0d\x76\x74\x0d\xc6\xa3\x9c\x59\x6f\x4a\x26\x8b\x07\x7d\xd9\xda\x55\xe3\xce\xab\x79\x4a\x62\x3c\x9e\xa1\xb0\xfb\xf4\xa7\x2a\x54\x3e\x26\x67\x9d\x6a\x97\xac\x95\x91\x2a\x2e\xa7\xcd\xec\x17\x2e\x4f\x7c\x6a\x65\xcc\xbe\x55\x9b\x65\x42\xb8\x94\xfb\xdf\xc7\x7c\xbb\x42\x25\x72\x19\xa2\x9a\xae\x09\x65\xa6\x6d\x7e\x85\x1a\x9c\x2b\xc1\x6c\xeb\xd9\xa8\x3f\x67\x72\x96\xe5\x55\x63\xbd\x89\x56\x61\xa2\x37\x7f\x80\x84\x9a\xae\x4d\x93\x5e\x58\xf4\x6d\x6f\x0a\x19\xe1\xc8\xdc\x77\x6f\x32\xbb\xbc\x71\xe1\xdf\x6b\x2c\x16\xef\x0c\x43\x03\x27\x38\x33\xcd\xf2\xce\xf1\xc3\x26\x0f\xd5\x51\x42\xa4\x89\x63\x99\xa3\x99\xa4\x5c\xbb\x87\x6d\x63\x50\x53\x93\x73\xba\x53\xa3\xaa\x6a\xda\xc8\xab\x41\xec\xf0\xe5\x2b\xb9\x7b\x25\x77\xbe\x92\x3b\xb0\xaa\x1a\x1e\xcd\x44\xdd\xa1\xbd\xc5\x7e\x9f\x42\xf1\x22\x97\xd4\xed\xcb\xdd\x99\x32\x26\x36\xe6\x40\x22\xda\x41\x32\x16\x1a\x06\x21\xf8\x4a\xc2\x84\x72\x9c\xf3\x95\x08\xce\xf3\xd4\xca\x95\x6b\x4c\x1b\x7d\xb9\xd4\xec\x7e\x3b\x27\xbe\x62\x2a\xe4\xf6\xfb\x26\xbc\xb3\x79\x20\xe7\xdd\x84\xc0\xbd\x2d\xb0\x6a\x5e\x4e\x6f\x45\x59\xb3\x02\xe8\xff\xf0\x80\xe1\xfe\xa4\x29\xe4\x6f\x38\xd5\x07\xe4\x9f\x93\x55\x85\x9e\x57\x2a\x94\xae\x22\x69\x3b\x7d\xb4\x46\x7a\xdd\x2d\x24\x5f\xe0\xe8\x62\x43\xb2\xd7\x5a\xe4\x36\x24\xeb\x5c\x16\xda\x1e\x57\xac\x3e\xc3\xeb\x8a\xf4\x11\xcf\x9b\xa5\x57\x78\x57\xeb\x42\x9f\xbd\x99\xdd\x28\xd3\x1a\xf5\x77\xe2\xb6\xf2\x8a\xfa\xcb\x24\x4d\x89\xdc\x1e\x68\x03\xcc\x2c\x63\x81\xf2\xb8\xdd\x08\xd4\xa7\x15\xc5\x7c\xb1\x46\xb9\xa6\xb8\x39\xdc\x1e\x54\x3b\x84\xdc\x20\xf6\x63\x92\xc7\xe8\xd5\x55\x9a\xd3\xec\xae\x65\xf8\x21\xde\x5c\x4a\x11\xa2\x52\xc7\xba\x9d\xaa\x3b\x59\x29\xe2\x6b\x91\x3d\xca\xa1\x9e\x3e\xe3\x3b\xba\x69\x5b\x8e\xc7\x38\xd8\xe1\x4d\xc3\xc0\x87\xc9\xb5\xd0\x84\x41\x99\x87\x1f\x6c\x66\x56\xf8\x09\xb3\xdc\xd7\x66\x8a\xef\x02\x6f\x5f\x6a\xec\x49\x81\xf2\xd5\x93\x51\x35\xbb\xbc\x81\x33\x41\x22\x98\xae\x51\x1e\xd0\xc7\x04\x89\xea\x8a\x76\x6f\xa4\xaa\xc8\x2c\x26\xc8\xec\x11\x5a\xf6\x2a\xcb\x50\xfa\x66\xff\xef\xc4\xd7\xad\xf2\x17\x89\xe4\x36\x12\x1b\xde\xa7\xd3\xa9\x5a\x96\xd3\x7a\x95\xb6\x53\xe3\xe8\xee\xfc\x1d\xd3\xa4\xdc\xa8\xbf\x53\xa6\xa4\xd6\xdc\xf1\x30\x2c\xe5\xa8\xf1\xa4\x02\x40\x8a\x0d\x74\x1f\x78\x0e\x86\xb0\x31\xad\xbd\x1c\xff\xcb\x9e\x2d\x6b\xae\x4a\x11\x4b\xb4\x2f\x50\xa1\xf5\xe9\x9a\xe8\x2f\x89\x84\xea\x0f\x3f\x32\x07\x55\xe9\x95\xeb\x88\x1b\x48\x84\xf6\x1d\x15\x9d\x9a\xa1\xbe\x57\x29\xe9\x0b\xce\xb6\xde\xe4\x57\xa1\xa1\x0c\x98\x3b\x24\x77\x48\xb6\xd9\x7c\x0a\x5c\xca\x57\xa2\x01\x36\x14\x2c\x7a\x0e\xda\x99\x60\xd1\x63\xe1\x0e\x06\x9d\xb8\xbb\x1f\xb6\x23\xf7\xde\xab\x66\x97\xc6\xbb\xe6\xea\xf3\xc4\xa2\x3c\x47\xbd\x11\xf2\xf6\x89\x55\x39\x78\x79\x39\x16\x86\x8b\xcd\xfe\x29\x85\x38\x68\x8e\x46\x52\x64\x26\xf9\xdb\x05\xb2\xcc\xb5\x16\xbb\x78\x2d\x35\x87\xa5\xe6\x7e\x84\x2b\x92\x33\x0d\xa5\x9c\xaf\x45\x1c\x33\xf4\x8a\xf7\xd9\x4e\xc8\xf1\xcc\x1d\x4a\x5f\x21\xc3\xd0\x1e\x01\x76\xc6\x20\x22\x9a\x14\xa2\x15\x0c\x40\x24\x25\x7e\x42\x54\x26\xb2\x3c\x3b\xf5\xb4\xcc\xb1\x78\x88\x77\x19\xe1\x11\x46\xa7\xde\x8a\x30\x85\x1d\x29\xe6\xd2\xab\xdb\x70\x19\xeb\xee\xfc\xaa\x25\x66\x48\x24\x56\xe6\x0e\xca\x4c\x70\x9e\xb5\x58\xca\x59\xb7\x49\xaf\x49\xb0\x9f\x22\xcf\x3d\x90\xc2\x78\xec\xbe\x5b\xc7\x6c\x77\xc9\x30\x5a\x6e\x0f\x32\xd6\xce\xf9\xe2\xf5\xd0\x81\xb4\x7d\xca\x82\x9c\x48\x91\xc7\x49\x96\xeb\xf6\x2a\xb8\x5b\x96\x4b\x78\xcb\xad\x46\xd5\xde\xbe\x9f\x61\xf6\xb3\x94\xc2\xbe\x3e\x6e\x6d\x01\xa5\x2d\xb4\x33\xfa\x8d\x35\x9c\x6f\x54\xe8\x17\xf5\xc3\xb6\xcc\x2f\x94\xa1\xda\x2a\x8d\xe9\xe3\x3b\xc8\xd5\x4e\xc6\xed\x7d\x9d\x4d\x64\xbf\xa6\x9e\x65\x6a\x96\x2b\x2d\xd2\xaf\xa8\x25\x0d\x9f\xca\xc7\x91\xc5\x6a\x70\x88\x81\xa9\xbb\xe1\x36\x79\x0c\x85\xf5\xe6\x8a\x75\x28\x57\x1a\xbd\x94\x75\xc2\x4f\x9d\x9e\xa3\xf9\x30\x68\x1e\x36\x3b\x6e\x41\x7e\x58\x6a\x74\xdc\x9d\x1c\xcb\x8e\xc7\x35\x55\x19\x98\xbe\xd9\xb6\x35\x1f\x9b\xeb\x05\xe5\x59\xae\x6b\xad\x6e\xf5\x86\xc4\x8f\xdc\x45\x9c\x1f\x8a\x9c\x6b\xaf\x73\xff\xde\x6d\xdd\x5d\x72\x56\x7d\x8f\xdc\x9a\xb0\x1c\x4f\x4f\xde\x36\x20\xf7\x2f\x34\x9d\x08\x6b\xdd\x60\x43\x53\xf7\x02\xf8\x4c\x0e\x5d\x33\x72\x94\xc6\xa2\x8d\xf8\x7b\x32\x59\x6b\xb5\x9c\x15\x29\x18\xab\x98\x59\x32\x11\xde\x36\x19\x68\xef\x8f\xcd\x9e\xfc\x15\xc3\xd2\xb3\x74\x77\x0c\x56\x87\x2a\x03\x87\xaf\xd2\x4b\x61\xa5\x89\xd4\x97\x24\xc6\x9f\xef\xef\x83\xdd\x0d\xaa\xbb\x71\x7e\x03\xe6\x59\xed\xfc\x6d\x1f\xb5\x8e\x5b\xf6\xa9\xbb\xca\xb5\x5f\xcb\x7b\x5d\xfb\xdf\x47\xe6\x13\x49\xb2\x71\xd7\x23\xc6\x4c\xfd\x26\xa6\x98\x54\xbf\xb9\x77\x17\xf6\xe3\x91\xfb\xd7\x96\xff\x07\x00\x00\xff\xff\x4b\x13\x4b\x6c\x3d\x25\x00\x00")
func pagesAssetsHtmlContainersHtmlBytes() ([]byte, error) {
return bindataRead(
......
......@@ -32,7 +32,7 @@ import (
var (
containerRegexp = regexp.MustCompile(`Task in (.*) killed as a result of limit of (.*)`)
lastLineRegexp = regexp.MustCompile(`(^[A-Z][a-z]{2} .*[0-9]{1,2} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) .* Killed process ([0-9]+) \(([\w]+)\)`)
lastLineRegexp = regexp.MustCompile(`(^[A-Z][a-z]{2} .*[0-9]{1,2} [0-9]{1,2}:[0-9]{2}:[0-9]{2}) .* Killed process ([0-9]+) \((.+)\)`)
firstLineRegexp = regexp.MustCompile(`invoked oom-killer:`)
)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment