Merge branch 'master' into docs
This commit is contained in:
commit
95044dd480
@ -1,5 +1,9 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
### 0.24.1 (2016-10-10)
|
||||||
|
|
||||||
|
- Fix issue with running cAdvisor in a container on some distributions.
|
||||||
|
|
||||||
### 0.24.0 (2016-09-19)
|
### 0.24.0 (2016-09-19)
|
||||||
|
|
||||||
- Added host-level inode stats (total & available)
|
- Added host-level inode stats (total & available)
|
||||||
|
3
Makefile
3
Makefile
@ -23,6 +23,9 @@ test:
|
|||||||
test-integration:
|
test-integration:
|
||||||
@./build/integration.sh
|
@./build/integration.sh
|
||||||
|
|
||||||
|
test-runner:
|
||||||
|
@$(GO) build github.com/google/cadvisor/integration/runner
|
||||||
|
|
||||||
format:
|
format:
|
||||||
@echo ">> formatting code"
|
@echo ">> formatting code"
|
||||||
@$(GO) fmt $(pkgs)
|
@$(GO) fmt $(pkgs)
|
||||||
|
@ -31,8 +31,11 @@ if [[ ! -z "$(git diff --name-only pages)" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
make
|
# Build & test with go 1.7
|
||||||
go build -tags test github.com/google/cadvisor/integration/runner
|
docker run --rm \
|
||||||
|
-w "/go/src/github.com/google/cadvisor" \
|
||||||
|
-v "${GOPATH}/src/github.com/google/cadvisor:/go/src/github.com/google/cadvisor" \
|
||||||
|
golang:1.7.1 make all test-runner
|
||||||
|
|
||||||
# Nodes that are currently stable. When tests fail on a specific node, and the failure is not remedied within a week, that node will be removed from this list.
|
# Nodes that are currently stable. When tests fail on a specific node, and the failure is not remedied within a week, that node will be removed from this list.
|
||||||
golden_nodes=(
|
golden_nodes=(
|
||||||
|
2
fs/fs.go
2
fs/fs.go
@ -346,7 +346,7 @@ func (self *RealFsInfo) GetFsInfoForPath(mountSet map[string]struct{}) ([]Fs, er
|
|||||||
return filesystems, nil
|
return filesystems, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var partitionRegex = regexp.MustCompile(`^(?:(?:s|xv)d[a-z]+\d*|dm-\d+)$`)
|
var partitionRegex = regexp.MustCompile(`^(?:(?:s|v|xv)d[a-z]+\d*|dm-\d+)$`)
|
||||||
|
|
||||||
func getDiskStatsMap(diskStatsFile string) (map[string]DiskStats, error) {
|
func getDiskStatsMap(diskStatsFile string) (map[string]DiskStats, error) {
|
||||||
diskStatsMap := make(map[string]DiskStats)
|
diskStatsMap := make(map[string]DiskStats)
|
||||||
|
@ -119,6 +119,8 @@ func ContainerStatsFromV1(spec *v1.ContainerSpec, stats []*v1.ContainerStats) []
|
|||||||
if spec.HasNetwork {
|
if spec.HasNetwork {
|
||||||
// TODO: Handle TcpStats
|
// TODO: Handle TcpStats
|
||||||
stat.Network = &NetworkStats{
|
stat.Network = &NetworkStats{
|
||||||
|
Tcp: TcpStat(val.Network.Tcp),
|
||||||
|
Tcp6: TcpStat(val.Network.Tcp6),
|
||||||
Interfaces: val.Network.Interfaces,
|
Interfaces: val.Network.Interfaces,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,16 @@ const (
|
|||||||
|
|
||||||
// NewTail starts opens the given file and watches it for deletion/rotation
|
// NewTail starts opens the given file and watches it for deletion/rotation
|
||||||
func NewTail(filename string) (*Tail, error) {
|
func NewTail(filename string) (*Tail, error) {
|
||||||
|
t, err := newTail(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
go t.watchLoop()
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// newTail creates a Tail object.
|
||||||
|
func newTail(filename string) (*Tail, error) {
|
||||||
t := &Tail{
|
t := &Tail{
|
||||||
filename: filename,
|
filename: filename,
|
||||||
}
|
}
|
||||||
@ -54,7 +64,9 @@ func NewTail(filename string) (*Tail, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("inotify init failed on %s: %v", t.filename, err)
|
return nil, fmt.Errorf("inotify init failed on %s: %v", t.filename, err)
|
||||||
}
|
}
|
||||||
go t.watchLoop()
|
// Initialize readerErr as io.EOF, so that the reader can work properly
|
||||||
|
// during initialization.
|
||||||
|
t.readerErr = io.EOF
|
||||||
return t, nil
|
return t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,23 +74,23 @@ func NewTail(filename string) (*Tail, error) {
|
|||||||
func (t *Tail) Read(p []byte) (int, error) {
|
func (t *Tail) Read(p []byte) (int, error) {
|
||||||
t.readerLock.RLock()
|
t.readerLock.RLock()
|
||||||
defer t.readerLock.RUnlock()
|
defer t.readerLock.RUnlock()
|
||||||
if t.reader == nil || t.readerErr != nil {
|
if t.readerErr != nil {
|
||||||
return 0, t.readerErr
|
return 0, t.readerErr
|
||||||
}
|
}
|
||||||
return t.reader.Read(p)
|
return t.reader.Read(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ io.Reader = &Tail{}
|
var _ io.ReadCloser = &Tail{}
|
||||||
|
|
||||||
// Close stops watching and closes the file
|
// Close stops watching and closes the file
|
||||||
func (t *Tail) Close() {
|
func (t *Tail) Close() error {
|
||||||
close(t.stop)
|
close(t.stop)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Tail) attemptOpen() error {
|
func (t *Tail) attemptOpen() error {
|
||||||
t.readerLock.Lock()
|
t.readerLock.Lock()
|
||||||
defer t.readerLock.Unlock()
|
defer t.readerLock.Unlock()
|
||||||
t.reader = nil
|
|
||||||
t.readerErr = nil
|
t.readerErr = nil
|
||||||
attempt := 0
|
attempt := 0
|
||||||
for interval := defaultRetryInterval; ; interval *= 2 {
|
for interval := defaultRetryInterval; ; interval *= 2 {
|
||||||
|
34
utils/tail/tail_test.go
Normal file
34
utils/tail/tail_test.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package tail
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestReadNewTail(t *testing.T) {
|
||||||
|
// Read should return (0, io.EOF) before first
|
||||||
|
// attemptOpen.
|
||||||
|
tail, err := newTail("test/nonexist/file")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
buf := make([]byte, 0, 100)
|
||||||
|
n, err := tail.Read(buf)
|
||||||
|
assert.Equal(t, n, 0)
|
||||||
|
assert.Equal(t, len(buf), 0)
|
||||||
|
assert.EqualError(t, err, io.EOF.Error())
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user